DuckDB 实战笔记 - 2026-09-16
📁 每天 200 个 CSV 要合并?DuckDB 一条 SQL 搞定
场景:运营每天从各渠道导出 CSV 到 data/2026-09-16/ 目录,格式一致但要合并分析。以前用 pandas 循环读 200 个文件,内存爆了还得等 5 分钟。
DuckDB 做法:直接读通配符路径,流式处理,不占内存。
-- 一条 SQL 合并整个目录的 CSV 并清洗
COPY (
SELECT
channel,
CAST(order_time AS TIMESTAMP) AS order_time,
amount,
-- 从文件名提取日期分区
regexp_extract(filename, '(\d{4}-\d{2}-\d{2})', 1) AS dt
FROM read_csv_auto('data/*/*.csv',
filename = true, -- 关键:保留来源文件名
union_by_name = true) -- 列顺序不一致也能合并
WHERE amount > 0
) TO 'output/clean_orders.parquet'
(FORMAT PARQUET, PARTITION_BY dt);
Python 里落地成每日管道:
import duckdb
from pathlib import Path
con = duckdb.connect('etl.duckdb')
today = '2026-09-16'
con.execute(f"""
CREATE OR REPLACE TABLE orders AS
SELECT * FROM read_csv_auto('data/{today}/*.csv',
union_by_name = true, filename = true)
""")
# 增量写入 Parquet 湖,按天分区
con.execute("""
COPY orders TO 'lake/orders'
(FORMAT PARQUET, PARTITION_BY (dt), APPEND)
""")
print(con.execute("SELECT count(*) FROM orders").fetchone())
为什么不用 pandas / Spark:
• pandas 要全量进内存,200 个文件就卡死
• Spark 要起集群,为这点数据杀鸡用牛刀
• DuckDB 单机、零依赖、read_csv_auto 自动推断 schema,一条 SQL 顶几十行胶水代码
核心价值:union_by_name + filename 两个参数,解决多文件合并 90% 的坑。今天就能把脚本里的 for 循环删掉。
#工具链 #ETL #多文件处理