使用 DuckDB 分析 CSV 文件
CSV 这种格式太常见了。银行导出的流水、购物平台导出的订单、自己记的账、各种后台导出的报表,基本都是 CSV。
想分析一下,用 Excel 打开大文件容易卡,用数据库又得先建表、导入,折腾一圈可能就为了看几个数。
DuckDB 可以直接读 CSV,自动推断列名和类型,然后用 SQL 查。
装完就能用,不用起服务。
1. 安装 DuckDB,直接读 CSV
DuckDB 是个嵌入式 OLAP 数据库,类似 SQLite,但面向分析。安装就一行:
curl https://install.duckdb.org | sh
/home/user/.duckdb/cli/latest/duckdb
启动后直接查 CSV:
SELECT * FROM read_csv('/opt/share/shopping_data.csv') LIMIT 5;
比如你从某个购物平台导出了一份 shopping_data.csv,里面有客户名、年龄、消费金额、商品类别。
read_csv() 直接扫描文件,自动处理表头和类型,不需要 CREATE TABLE,也不需要 COPY 导入。
2. 先看数据结构
数据已经摆在眼前,但先别急着动手。就像下厨前要先认识食材一样,我们得先搞清楚这份数据的“脾气秉性”。
查之前先确认列名和类型,避免后面算错。
DESCRIBE SELECT * FROM read_csv('/opt/share/shopping_data.csv') LIMIT 5;
输出会列出每列的类型,比如 age 是 BIGINT,purchase_amount 是 DOUBLE,category 是 VARCHAR。
知道类型后,聚合和筛选就稳了。
3. 快速汇总统计
好了,现在我们对数据已经了如指掌,是时候来回答最基础的问题了。
比如你想知道这份购物记录里,客户年龄和消费金额的大致范围。
SELECT MIN(age) AS min_age, MAX(age) AS max_age, AVG(age) AS avg_age,
MIN(purchase_amount) AS min_purchase, MAX(purchase_amount) AS max_purchase,
AVG(purchase_amount) AS avg_purchase
FROM read_csv('/opt/share/shopping_data.csv');
一条 SQL 就能看到最小年龄、最大年龄、平均年龄,以及消费金额的最小值、最大值、平均值。
DuckDB 直接扫 CSV,不用先把数据倒进数据库。
4. 筛选和排序
知道了整体情况,我们再来聚焦看看。
比如你想找出消费超过 200 元的记录,按金额从高到低排。
SELECT customer_name, age, purchase_amount, category
FROM read_csv('/opt/share/shopping_data.csv')
WHERE purchase_amount > 200
ORDER BY purchase_amount DESC;
这就是标准 SQL。
DuckDB 的优势在于:文件在哪,SQL 就查哪。不需要先把 CSV 转成别的格式,也不需要入库。
5. 分组聚合
看完了单笔大额消费,我们再把视角拉高,从整体上看看不同商品类别的表现。
比如你想按商品类别统计:每个类别多少笔交易、总销售额多少、平均每笔花多少。
SELECT category,
COUNT(*) AS total_purchases,
SUM(purchase_amount) AS total_sales,
AVG(purchase_amount) AS avg_spent
FROM read_csv('/opt/share/shopping_data.csv')
GROUP BY category
ORDER BY total_sales DESC;
结果就是每个类别的交易数、总销售额、平均消费。
比如 食品、电子产品各卖了多少钱,一目了然。
6. 总结
DuckDB 适合这种场景:
- 手头有 CSV 文件,想快速分析;
- 不想建库、导数据、起服务;
- 需要 SQL 聚合、分组、筛选、排序;
- 本地单机跑,快,零运维。
核心就一句:read_csv() 直接查。
对 CSV 文件来说,DuckDB 基本是“打开即用”的 SQL 引擎。
后面如果需要窗口函数、JOIN 这些高级操作,也可以继续在同一个文件上写。
文中用到的 CSV 数据文件:shopping_data.csv: https://url11.ctfile.com/f/45455611-17569897513022-10cab0?p=6872 (访问密码: 6872)

浙公网安备 33010602011771号