⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
CLI Charting with YouPlot

DuckDB 可以与 CLI 绘图工具一起使用,快速将输入通过管道传输到标准输出,以便在一行中绘制数据图表。

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

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

安装 YouPlot

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

brew install youplot

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

将 DuckDB 查询管道传输到标准输出

通过将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

额外回合!标准输入 + 标准输出

也许你正在通过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