DuckDB 实战笔记 - 2026-09-02
📦 别再写 200 行 Pandas 拼接代码了,3 个函数搞定多文件 ETL
业务场景:你每天从 5 个业务库导出 CSV(销售、库存、用户、订单、退款),文件名带日期。老板要一份汇总大宽表,且每天自动更新。以前你写 for 循环 + concat,字段名对不上就报错,改到怀疑人生。
用 DuckDB 的 read_csv_auto + glob,3 步走:
import duckdb
# 1. 建库(文件不存在会自动创建)
con = duckdb.connect('etl.duckdb')
# 2. 多文件读取 + 清洗 + 合并(自动推断 schema,字段不一致也能容错)
con.execute("""
CREATE OR REPLACE TABLE sales_agg AS
SELECT
filename,
region,
SUM(amount) AS total_amount,
COUNT(*) AS order_cnt
FROM read_csv_auto('data/sales_*.csv',
header=true,
filename=true,
sample_size=-1)
WHERE amount > 0 -- 清洗脏数据
GROUP BY 1, 2
""")
# 3. 直接输出为 Parquet(压缩 10 倍,下游直接查)
con.execute("COPY sales_agg TO 'output/sales_agg.parquet' (FORMAT PARQUET)")
con.close()
核心价值:
- 零依赖:一个 Python 文件 + DuckDB,不需要 Spark 或 Airflow
- 自动识别类型:
read_csv_auto自动处理日期/数字/字符串,不用手动指定 dtype - 增量更新:用
INSERT OR REPLACE配合文件名过滤,只处理新文件 - 性能碾压:处理 1GB 多文件,DuckDB 比 Pandas 快 5-10 倍,内存占用低 90%
进阶技巧:想要按天增量?加一个 WHERE filename >= ‘2026-09-01’ 即可,DuckDB 会下推过滤,只读新文件。
#DuckDB #ETL #数据管道 #效率工具