概述
你还在用 Pandas 处理大文件吗?加载 10GB 的 CSV 就内存爆了?试试 DuckDB。
DuckDB 是一个嵌入式列式数据库,专门为数据分析而生。它能直接读 CSV、Parquet、JSON,查询速度比 Pandas 快 10 倍以上,而且不需要启动任何服务——就是一个 Python 库,直接 import 就能用。
这篇教程教你在本地快速搭建 DuckDB 开发环境。
准备工作
- 一台电脑(Mac / Linux / Windows 都行)
- Python 3.9 或以上版本
- 大概 5 分钟时间
步骤
第一步:创建项目目录
mkdir -p ~/duckdb-workspace && cd ~/duckdb-workspace
第二步:创建虚拟环境
python3 -m venv .venv
source .venv/bin/activate
激活后,你的终端前面会出现 (.venv) 标记。
第三步:安装 DuckDB
pip install duckdb
安装完验证一下:
python3 -c "import duckdb; print(duckdb.__version__)"
看到版本号就说明装好了。
第四步:安装常用扩展包
数据分析通常还需要一些配套工具:
pip install duckdb pillow matplotlib pandas pyarrow
pyarrow:读写 Parquet 文件pillow:处理图片数据matplotlib:数据可视化pandas:兼容 Pandas 的查询接口
第五步:验证环境
创建一个测试脚本,确认一切正常:
# test_duckdb.py
import duckdb
# 直接查一个内存表
result = duckdb.query("SELECT 42 AS answer").fetchall()
print(f"DuckDB 查询结果: {result}")
# 创建临时表测试
duckdb.query("""
CREATE TABLE users AS
SELECT 'Alice' AS name, 28 AS age
UNION ALL SELECT 'Bob', 32
UNION ALL SELECT 'Carol', 25
""")
result = duckdb.query("SELECT * FROM users WHERE age > 26").fetchall()
print(f"26岁以上的用户: {result}")
print("DuckDB 环境搭建成功!")
运行测试:
python3 test_duckdb.py
输出应该是:
DuckDB 查询结果: [(42,)]
26岁以上的用户: [('Alice', 28), ('Bob', 32)]
DuckDB 环境搭建成功!
第六步:用 DuckDB 读 CSV 文件
DuckDB 最强大的地方是直接读 CSV,不用把数据加载到内存里:
import duckdb
# 直接查询 CSV 文件,不用读进 Pandas
result = duckdb.query("""
SELECT city, COUNT(*) as cnt
FROM read_csv_auto('data.csv')
GROUP BY city
ORDER BY cnt DESC
LIMIT 10
""").df()
print(result)
read_csv_auto 会自动检测分隔符和编码,不需要手动指定。
第七步:配置 VS Code 开发环境(可选)
如果你用 VS Code 开发,装两个扩展体验会更好:
- Python 扩展(Microsoft 官方)
- DuckDB 扩展(社区插件)
然后在 .vscode/settings.json 里加上:
{
"python.defaultInterpreterPath": ".venv/bin/python",
"python.terminal.activateEnvironment": true
}
这样每次打开终端都会自动激活虚拟环境。
第八步:持久化查询结果
DuckDB 支持把查询结果保存成 Parquet 格式,文件比 CSV 小很多:
import duckdb
# 查询并保存为 Parquet
duckdb.query("""
SELECT * FROM read_csv_auto('large_dataset.csv')
WHERE created_at > '2024-01-01'
""").write.parquet("filtered_data.parquet")
print("已保存到 filtered_data.parquet")
Parquet 格式压缩率高,下次读取速度快,非常适合做数据预处理。
验证
全部做完后,跑这几个检查确认环境健康:
# 1. DuckDB 版本
python3 -c "import duckdb; print(duckdb.__version__)"
# 2. 扩展是否可用
python3 -c "import duckdb; print(duckdb.extensions)"
# 3. 虚拟环境是否激活
which python3
# 4. 快速查询测试
python3 -c "import duckdb; print(duckdb.query('SELECT 1+1').fetchone())"
全部通过就说明环境没问题。
常见问题
DuckDB 和 SQLite 有什么区别?
DuckDB 是列式存储,SQLite 是行式存储。查询聚合、统计类操作,DuckDB 快很多;但简单 CRUD 场景,SQLite 够用且更轻量。
DuckDB 支持并发写入吗?
不支持。DuckDB 只支持单写入者,多读取者。如果需要并发写入,用 PostgreSQL 或 MySQL。
怎么在 Jupyter 里用 DuckDB?
直接在单元格裡写 SQL 就行,不需要额外配置:
%load_ext duckdb
%duckdb连接
SELECT * FROM my_table LIMIT 10
或者用 Python API:
import duckdb
df = duckdb.query("SELECT * FROM my_data").df()
DuckDB 能连 MySQL / PostgreSQL 吗?
可以。装好扩展后直接查:
import duckdb
duckdb.query("INSTALL mysql; LOAD mysql;").execute()
result = duckdb.query("SELECT * FROM mysql_scanner('host=localhost', 'database=mydb', 'table=mytable')").fetchall()
怎么升级 DuckDB?
pip install --upgrade duckdb
DuckDB 文件存哪里?
不传路径的话,DuckDB 数据存在内存里,进程退出就没了。传个路径就会存成 .duckdb 文件:
con = duckdb.connect("my_data.duckdb")
# 数据持久化到 my_data.duckdb
DuckDB 的门槛很低——装好就能用,不用配服务、不用建库。把 CSV 扔进去直接查 SQL,比 Pandas 快得多。下次处理大文件的时候,试试 DuckDB 吧。
你的数据分析场景遇到过内存瓶颈吗?