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 #多文件处理

📺 Watch video tutorials → Olap Studio YouTube

Subscribe for more DuckDB & AI automation tutorials

使用 Hugo 构建
主题 StackJimmy 设计

⚠️ 本站为独立社区项目,与 DuckDB 基金会及 DuckDB 官方项目无任何从属、背书或赞助关系。

"DuckDB" 是 DuckDB 基金会的注册商标,本站仅以事实描述方式使用该名称。

本站内容仅供教育与社区推广用途,不构成任何商业服务。