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 duckdb

Python 使用

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/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 级部署复杂、资源占用高大数据平台

实战案例

-- 批量分析 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 级数据,避免搭建复杂分布式平台。