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。执行此操作有三个重要步骤。
-
例如,这是如何从
input.json
读取所有数据的方法:duckdb -s "SELECT * FROM read_json_auto('input.json')"
-
为了准备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"
-
最后,将
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
)。
额外回合!标准输入 + 标准输出
也许你正在通过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"