使用 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)

posted @ 2026-09-22 20:15  wang_yb  阅读(29)  评论(0)    收藏  举报