张芷铭的个人博客

DuckDB 是嵌入式 OLAP 数据库,专为本地大数据分析设计,兼具轻量性、高性能与易用性,可直接读取 JSON、CSV、Parquet 等文件。

核心特性

特性说明
轻量嵌入式无需独立服务端,嵌入 Python/Java/C++ 程序
多格式支持原生读取 JSON/CSV/Parquet/Excel
标准 SQL完整语法支持,学习成本低
高性能列式存储 + 向量化执行,GB 级数据查询提速 10-100 倍

高效原理

列式存储

  • 同一列数据集中存储,查询时仅读取目标列
  • IO 量减少 80%+,同列数据高效压缩

向量化执行

  • 数据分批(1024 行/批),CPU SIMD 批量处理
  • 较逐行模式提速数十倍

零拷贝读取

  • mmap 内存映射,直接操作磁盘文件映射的内存
  • 避免多次拷贝,减少内存开销

智能优化器

  • 谓词下推、列裁剪、聚合优化
  • 自动生成最优执行计划

快速开始

安装

1
pip install duckdb

Python 使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import duckdb

# 连接数据库(内存模式)
conn = duckdb.connect()

# 读取 JSONL 文件
conn.execute("""
CREATE VIEW tbl AS
SELECT * FROM read_json('/path/to/*.jsonl', format='newline_delimited', ignore_errors=true)
""")

# 查询
result = conn.execute("SELECT count(*) FROM tbl WHERE status='success'").fetchone()
print(result)

# 关闭
conn.close()

命令行使用

1
2
3
4
5
6
7
8
9
duckdb

# 读取 CSV
CREATE VIEW csv_tbl AS SELECT * FROM read_csv('/path/to/*.csv', header=true);

# 查询
SELECT category, sum(amount) FROM csv_tbl GROUP BY category;

.quit

关键技巧

视图 vs 物理表

类型说明适用场景
VIEW虚拟表,不存储数据原文件频繁更新
TABLE存入 DuckDB 文件多次查询、数据固定
1
2
-- 创建物理表
CREATE TABLE tbl AS SELECT * FROM read_json('/path/to/*.jsonl');

文件读取函数

格式函数
JSON/JSONLread_json()
CSVread_csv()
Parquetread_parquet()
ExcelINSTALL excel; LOAD excel; read_excel()

注意事项

  • 路径:Linux/macOS 用 /,Windows 用 \/
  • 错误处理:加 ignore_errors=true 避免坏数据中断
  • 类型识别:columns 参数手动指定字段类型

工具对比

工具优势劣势适用场景
DuckDB本地高效、直接读文件不支持高并发 OLTPGB 级数据分析
Pandas灵活、生态完善逐行处理慢、内存占用高MB 级数据清洗
MySQL高并发 OLTPOLAP 性能弱业务事务处理
Spark分布式、PB 级部署复杂、资源占用高大数据平台

实战案例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 批量分析 JSONL 文件
duckdb analysis.db

CREATE TABLE data AS
SELECT id, image_path, status, create_time
FROM read_json('/path/to/*.jsonl', format='newline_delimited', ignore_errors=true);

-- 统计
SELECT status, count(*) FROM data GROUP BY status;

-- 导出结果
COPY (SELECT * FROM data WHERE status='success') TO '/path/to/output.csv' (FORMAT CSV, HEADER);

DuckDB 核心价值:填补"本地高效数据分析"空白,替代 Pandas 处理 GB 级数据,避免搭建复杂分布式平台。

Comments