当前位置:首页>python>Python库巡礼--DuckDB

Python库巡礼--DuckDB

  • 2026-10-12 00:19:32
Python库巡礼--DuckDB
Python的第三方库生态非常强大,涉及数据分析,机器学习,Web开发,可视化,自然语言,图像处理,自动化办公等。通过pip等包管理工具快速安装和升级,大幅提升了开发效率,并推动了跨学科应用的普及!
今天我们看下DuckDB,一个开源、嵌入式、列式存储的关系型数据库管理系统(RDBMS),专为在线分析处理(OLAP) 设计。与传统数据库不同,它:
  • ✅ 无需独立服务器,直接在Python进程中运行
  • ✅ 零外部依赖,单文件部署(pip install duckdb 即可)
  • ✅ 原生支持直接查询 CSV/Parquet/JSON 等文件格式
  • ✅ 与 Pandas/Polars 无缝集成,可作为"分析引擎"替代部分DataFrame操作
DuckDB目前已成为数据分析领域增长最快的工具之一,被广泛用于AI/ML数据预处理,其发展历程如下:

时间

里程碑

2018年

由 Mark Raasveldt 和 Hannes Mühleisen 在荷兰数学与计算机科学中心(CWI)启动开发 

2019年

首次公开发布 

2021年7月

创始人成立商业公司 DuckDB Labs,提供企业级支持 

2024年6月

发布首个官方"稳定版"(项目实际已迭代5年)

2025年

1.4.0 LTS(长期支持版)发布,新增:• 数据库加密• MERGE 语句(UPSERT)• Iceberg 格式写入支持• CLI 进度条与ETA 

为什么选择DuckDB?

场景

优势

大数据分析

比Pandas快10-100倍(列式存储+向量化执行)

ETL管道

直接查询原始文件,避免中间转换步骤

Jupyter Notebook

用SQL替代复杂Pandas链式操作,代码更易读

资源受限环境

单文件部署,无服务器依赖,适合边缘计算

AI/ML预处理

高效特征工程,支持窗口函数、聚合等 

下面是一些简单代码示例

示例1:基础用法(内存数据库)

import duckdb# 创建内存数据库连接con = duckdb.connect(database=':memory:')# 直接执行SQL(自动创建表)con.execute("""    CREATE TABLE sales (        product VARCHAR,        amount DECIMAL(10,2),        date DATE    )""")# 插入数据con.execute("INSERT INTO sales VALUES ('Laptop', 1200.50, '2025-01-15')")con.execute("INSERT INTO sales VALUES ('Mouse', 25.99, '2025-01-16')")# 查询并转为Pandas DataFramedf = con.execute("""    SELECT product, amount     FROM sales     WHERE amount > 100""").fetchdf()print(df)#      product   amount# 0     Laptop  1200.50

示例2:与Pandas无缝集成

import pandas as pdimport duckdb# 创建Pandas DataFramedf = pd.DataFrame({    'name': ['Alice', 'Bob', 'Charlie'],    'age': [25, 30, 35],    'salary': [50000, 60000, 75000]})# 将DataFrame注册为DuckDB虚拟表con = duckdb.connect()con.register('employees', df)# 用SQL分析Pandas数据high_earners = con.sql("""    SELECT name, salary     FROM employees     WHERE salary > 60000""").df()print(high_earners)#      name  salary# 0  Charlie   75000

示例3:复杂分析(窗口函数 + JSON)

import duckdb# 查询JSON文件并使用窗口函数result = duckdb.sql("""    WITH user_events AS (        SELECT             user_id,            event_type,            event_time,            ROW_NUMBER() OVER (                PARTITION BY user_id                 ORDER BY event_time DESC            ) as rn        FROM read_json_auto('events.json')    )    SELECT user_id, event_type, event_time    FROM user_events    WHERE rn = 1  -- 每个用户的最新事件""").show()  # 直接在终端显示表格
熟悉MapReduce/SQL的小伙伴们看到下面这句
ROW_NUMBER()
应该会倍感亲切吧~


过往文章/合集

合集

文章

Python编程小技巧

Python编程小技巧--用Python查询天气

Python编程小技巧--‌自制简易系统监控

Python--数据/图像可视化

Python编程小技巧--雷达图

Python编程小技巧--新年倒计时小工具2.0版

Python编程小技巧--桑基图(Sankey Diagram)

Python编程基础算法

Python编程基础算法--斐波那契数列的矩阵算法

Python编程基础算法--LeetCode编辑距离问题

细数那些经典教材

细数那些经典教材--算法与数据结构

细数那些经典教材--编程竞赛

Python库巡礼

Python库巡礼--Polars

Python库巡礼--Dask

Python与数学之美

Python与数学之美--黄金螺线

Python与数学之美--摆线/旋轮线(Cycloid)

Python与办公自动化
Python与办公自动化--批量生成报告/通知

最新文章

随机文章