DuckDB 实战笔记 - 2026-08-19
🔥 告别 500 行 Pandas:用 DuckDB 一行搞定多文件 ETL
场景: 你每天要处理 30 个 CSV(销售、库存、退货),字段名不一致,还有脏数据。以前写 Pandas 循环拼接,跑一次要 20 分钟,还老报错。今天教你用 DuckDB 的 read_csv_auto + UNION ALL BY NAME 10 秒搞定。
核心代码(Python + DuckDB):
import duckdb
# 自动识别所有 CSV,按列名自动对齐(缺失列补 NULL)
df = duckdb.sql("""
SELECT * FROM read_csv_auto('data/*.csv',
header=true,
union_by_name=true)
WHERE 日期 >= DATE '2026-08-01'
AND 金额 > 0 -- 顺手清洗脏数据
""").df()
# 直接聚合,不用先加载到 DataFrame
result = duckdb.sql("""
SELECT 产品类别,
SUM(金额) AS 总销售额,
COUNT(*) AS 订单数
FROM read_csv_auto('data/*.csv', union_by_name=true)
GROUP BY 1
ORDER BY 2 DESC
""").df()
为什么用 DuckDB?
- 零配置:不用建表、不用定义 schema,CSV 即查即用
- 性能碾压:并行读取 + 列式存储,比 Pandas 快 5-10 倍
- 内存友好:处理 10GB 文件,内存占用不到 500MB
- SQL 顺手:清洗、JOIN、窗口函数全在 SQL 里,代码量减少 80%
进阶技巧: 如果文件在 S3 或 HTTP 上,直接换路径 ‘s3://bucket/.csv’ 或 ‘https://…/.csv’,DuckDB 原生支持,不用下载。
坑提醒: 文件名带日期(如 sales_20260819.csv)时,用 filename 伪列提取日期做增量处理,比读文件列表再循环快得多。
👆 复制这段代码,把路径换成你的文件,今天就跑起来。