⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
使用 YouPlot 进行 CLI 图表绘制

DuckDB 可以与 CLI 图形工具配合使用,将输入快速通过管道传输到 stdout,从而在一行代码中绘制数据图表。

YouPlot 是一个基于 Ruby 的 CLI 工具,用于在终端上绘制视觉上令人愉悦的图表。它可以通过从 stdin 管道传输数据来接受其他程序的输入。它接受制表符分隔(或您选择的分隔符)的数据,并且可以轻松生成各种类型的图表,包括条形图、折线图、直方图和散点图。

使用 DuckDB,您可以通过 TO '/dev/stdout' 命令将数据写入控制台(stdout)。您还可以使用 WITH (FORMAT csv, HEADER) 写入逗号分隔的值。

安装 YouPlot

YouPlot 的安装说明可以在主要的 YouPlot 仓库中找到。如果您使用的是 Mac,您可以使用

brew install youplot

运行 uplot --help 以确保您已成功安装!

将 DuckDB 查询通过管道传输到 stdout

通过将 COPY...TO 函数与 CSV 输出文件结合使用,可以从 DuckDB 支持的任何格式读取数据并将其通过管道传输到 YouPlot。这有三个重要步骤。

  1. 例如,以下是如何从 input.json 读取所有数据

    duckdb -s "SELECT * FROM read_json_auto('input.json')"
    
  2. 为了 YouPlot 准备数据,编写一个简单的聚合查询

    duckdb -s "SELECT date, sum(purchases) AS total_purchases FROM read_json_auto('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10"
    
  3. 最后,将 SELECT 语句封装在 COPY ... TO 函数中,并将输出位置指定为 /dev/stdout

    语法如下

    COPY (query) TO '/dev/stdout' WITH (FORMAT csv, HEADER);
    

    下面的完整 DuckDB 命令以 CSV 格式输出查询,并带有标题

    duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json_auto('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)"
    

将 DuckDB 连接到 YouPlot

最后,数据现在可以传输到 YouPlot 了!假设我们有一个 input.json 文件,其中包含日期和某人当天进行的购买数量。使用上面的查询,我们将数据传输到 uplot 命令,以绘制前 10 个购买日期的图表

duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json_auto('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
     | uplot bar -d, -H -t "Top 10 Purchase Dates"

这告诉 uplot 绘制一个条形图,使用逗号分隔符(-d,),数据包含标题(-H),并为图表提供一个标题(-t)。

youplot-top-10

额外环节!stdin + stdout

也许您正在通过 jq 管道传输一些数据。也许您正在从某个地方下载 JSON 文件。您还可以通过将文件名更改为 /dev/stdin 来告诉 DuckDB 从另一个进程读取数据。

让我们将此与从 GitHub 快速 curl 结合起来,看看某个用户最近在做什么。

curl -sL "https://api.github.com/users/dacort/events?per_page=100" \
     | duckdb -s "COPY (SELECT type, count(*) AS event_count FROM read_json_auto('/dev/stdin') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
     | uplot bar -d, -H -t "GitHub Events for @dacort"

github-events