DuckDB 本地数据分析环境搭建:比 Pandas 快 10 倍的轻量级方案

概述

你还在用 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 开发,装两个扩展体验会更好:

  1. Python 扩展(Microsoft 官方)
  2. 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 吧。

你的数据分析场景遇到过内存瓶颈吗?

这篇文章对你有帮助吗?