DuckDB 是嵌入式 OLAP 数据库,专为本地大数据分析设计,兼具轻量性、高性能与易用性,可直接读取 JSON、CSV、Parquet 等文件。
核心特性
| 特性 | 说明 |
|---|
| 轻量嵌入式 | 无需独立服务端,嵌入 Python/Java/C++ 程序 |
| 多格式支持 | 原生读取 JSON/CSV/Parquet/Excel |
| 标准 SQL | 完整语法支持,学习成本低 |
| 高性能 | 列式存储 + 向量化执行,GB 级数据查询提速 10-100 倍 |
高效原理
列式存储
- 同一列数据集中存储,查询时仅读取目标列
- IO 量减少 80%+,同列数据高效压缩
向量化执行
- 数据分批(1024 行/批),CPU SIMD 批量处理
- 较逐行模式提速数十倍
零拷贝读取
- mmap 内存映射,直接操作磁盘文件映射的内存
- 避免多次拷贝,减少内存开销
智能优化器
快速开始
安装
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/JSONL | read_json() |
| CSV | read_csv() |
| Parquet | read_parquet() |
| Excel | INSTALL excel; LOAD excel; read_excel() |
注意事项
- 路径:Linux/macOS 用
/,Windows 用 \ 或 / - 错误处理:加
ignore_errors=true 避免坏数据中断 - 类型识别:
columns 参数手动指定字段类型
工具对比
| 工具 | 优势 | 劣势 | 适用场景 |
|---|
| DuckDB | 本地高效、直接读文件 | 不支持高并发 OLTP | GB 级数据分析 |
| Pandas | 灵活、生态完善 | 逐行处理慢、内存占用高 | MB 级数据清洗 |
| MySQL | 高并发 OLTP | OLAP 性能弱 | 业务事务处理 |
| 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