DuckDB 是嵌入式 OLAP 数据库,专为本地大数据分析设计,兼具轻量性、高性能与易用性,可直接读取 JSON、CSV、Parquet 等文件。
OLTP和OLAP数据库
- OLTP (OnLine Transaction Processing, 在线事务处理)= 业务数据库:小数据、实时、增删改查(MySQL)
- OLAP (OnLine Analytical Processing, 在线分析处理)= 分析数据库:大数据、统计、聚合、报表(DuckDB)
|项目|OLTP|OLAP| |:—|:—|:—| |核心用途|业务系统、日常增删改查|数据分析、报表、统计、聚合| |典型操作|INSERT、UPDATE、DELETE、单条查询|SELECT、GROUP BY、SUM、COUNT、JOIN| |数据量|单条 / 少量,短事务|海量(百万~亿行)| |读写特点|写多、读少、高并发|读多、写少、批量导入| |存储结构|行存储(一行一起读)|列存储(一列一列读)| |响应要求|毫秒级、低延迟|秒级~分钟级可接受| |典型数据库|MySQL、PostgreSQL、SQLServer|DuckDB、ClickHouse、Spark SQL、 Doris| |你的场景|订单、用户、登录、支付|500w 行 CSV 统计、求和、分组|
核心特性
| 特性 | 说明 |
|---|---|
| 轻量嵌入式 | 无需独立服务端,嵌入 Python/Java/C++ 程序 |
| 多格式支持 | 原生读取 JSON/CSV/Parquet/Excel |
| 标准 SQL | 完整语法支持,学习成本低 |
| 高性能 | 列式存储 + 向量化执行,GB 级数据查询提速 10-100 倍 |
高效原理
列式存储
- 同一列数据集中存储,查询时仅读取目标列
- IO 量减少 80%+,同列数据高效压缩
向量化执行
- 数据分批(1024 行/批),CPU SIMD 批量处理
- 较逐行模式提速数十倍
零拷贝读取
- mmap 内存映射,直接操作磁盘文件映射的内存
- 避免多次拷贝,减少内存开销
智能优化器
- 谓词下推、列裁剪、聚合优化
- 自动生成最优执行计划
快速开始
安装
pip install duckdbPython 使用
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()命令行使用
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 文件 | 多次查询、数据固定 |
-- 创建物理表
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 级 | 部署复杂、资源占用高 | 大数据平台 |
实战案例
-- 批量分析 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 级数据,避免搭建复杂分布式平台。