DuckDB学习
一、什么是DuckDB
DuckDB 是一款高性能的嵌入式 SQL 数据库管理系统,专为在线分析处理(OLAP)设计。它以其轻量级、快速查询和易用性,成为数据分析领域的热门工具,被誉为"分析型的 SQLite"。
DuckDB 采用 列式存储 和 向量化查询引擎 ,显著提升了数据分析查询的性能。它支持标准 SQL 语法,包括窗口函数、复杂数据类型(如数组、结构体)和嵌套查询。此外,DuckDB 是一个 单文件数据库,无需复杂配置,安装简单,适合快速部署。
DuckDB 与 Python 和 R 深度集成,支持与 pandas 和 dplyr 的无缝协作。同时,它兼容 Apache Arrow 和 Parquet 等现代数据格式,支持直接查询 CSV、Parquet 和 JSON 文件,无需额外加载步骤。
二、安装
bash
pip install duckdb openpyxl
首次使用需要加载excel拓展(仅支持.xlsx后缀的excel文件 ,不支持.xls后缀)
python
import duckdb
db = duckdb.connect()
db.sql("INSTALL excel; LOAD excel;")
没有研究到太深,学习的初衷是因为笔者在做数据分析的时候发现数据加载会较慢,而且使用pandas操作,其中涉及的函数较多,各类参数又有设置,所以想找一个简单快速的操作方式。
三、测试数据
试试.xlsx sheet页:测试表1
| 名字 | 年龄 |
|---|---|
| 名字1 | 21 |
| 名字2 | 22 |
| 名字3 | 23 |
| 名字4 | 24 |
| 名字5 | 25 |
| 名字6 | 26 |
试试1.xlsx sheet页:测试表2
| 名字 | 编号 |
|---|---|
| 名字1 | 211 |
| 名字2 | 212 |
| 名字3 | 213 |
| 名字4 | 214 |
| 名字5 | 215 |
| 名字6 | 216 |
三、读取excel
3.1 单个文件读取
python
import duckdb
import pandas as pd
excel_path = r'试试.xlsx'
sheet_name = '测试表1'
# pandas读取指定sheet,A-F前100行
df_raw = pd.read_excel(
excel_path,
sheet_name=sheet_name,
usecols="A:B",
nrows=99
)
# 注册进duckdb内存表,后续随便写SQL分析
db = duckdb.connect()
db.register("excel_table", df_raw)
# 示例查询
df = db.sql("SELECT * FROM excel_table where 名字 = '名字1'").df()
print(df)
3.2 读取多个文件
shell
import duckdb
import pandas as pd
excel_path = r'试试.xlsx'
excel_path1 = r'试试1.xlsx'
sheet_name = '测试表1'
sheet_name1 = '测试表2'
df_raw = pd.read_excel(
excel_path,
sheet_name=sheet_name,
usecols="A:B",
nrows=99
)
df_raw1 = pd.read_excel(
excel_path1,
sheet_name=sheet_name1,
usecols="A:B",
nrows=99
)
# 注册进duckdb内存表,后续随便写SQL分析
db = duckdb.connect()
db.register("excel_table", df_raw)
db.register("excel_table1", df_raw1)
# 示例查询
df = db.sql("""
SELECT t1.名字,t1.年龄,t2.编号 FROM excel_table t1
left join excel_table1 t2
on t1.名字 = t2.名字
where t1.名字 = '名字1'
""").df()
print(df)
3.3 聚合
python
import duckdb
import pandas as pd
excel_path = r'F:\2026.07\试试.xlsx'
sheet_name = '测试表1'
df_raw = pd.read_excel(
excel_path,
sheet_name=sheet_name,
usecols="A:B",
nrows=99
)
# 注册进duckdb内存表,后续随便写SQL分析
db = duckdb.connect()
db.register("excel_table", df_raw)
# 示例查询
df = db.sql("""
SELECT sum(t1.年龄) FROM excel_table t1
""").df()
print(df)