DuckDB在Python中的实现

2025 年 3 月 4 日 | 阅读 6 分钟

引言

DuckDB 在数据管理和分析领域正掀起波澜。人们常称它为“分析领域的 SQLite”。它是一个 SQL 数据库管理系统,可以直接在其他程序中运行。DuckDB 专为高效处理分析型任务而设计。它与常规数据库不同,因为它能够嵌入到应用程序中。这使其成为数据科学家、分析师和开发人员的理想选择。我们将探讨 DuckDB 的构建方式、它如何与 Python 配合工作,以及人们如何利用它来分析数据。

什么是 DuckDB?

DuckDB 是一个免费的开源 SQL OLAP(在线分析处理)数据库管理系统。它直接在其他程序中运行。它的设计目的是快速完成分析性查询任务,即使在常规数据库可能表现缓慢的情况下也能如此。DuckDB 与使用它的应用程序共享相同的内存空间。这意味着它可以快速访问数据,并且不需要复杂的客户端-服务器通信方式。

DuckDB 的创建者希望简化复杂数据分析的实现。他们开发了一个易于集成到其他程序、简单易用且运行速度快的工具。无论是在单台计算机上进行数据查看,还是在需要每个部分独立数据分析功能的大型系统中,它都表现出色。

DuckDB 的主要特点

  1. 进程内执行: 与作为独立进程运行的传统数据库系统不同,DuckDB 在应用程序的同一进程中运行。这种方法可以减少开销,并提高交互式数据分析任务的性能。
  2. 列式存储: DuckDB 以列式格式存储数据,这对于处理大型数据集的分析查询非常有效。这种存储方式可以实现更好的压缩和更快的查询执行速度,特别适合读密集型操作。
  3. SQL 支持: DuckDB 支持广泛的 SQL 查询,包括复杂的 JOIN、聚合和窗口函数。这使其成为执行复杂数据分析的有用工具,而无需学习新的查询语言。
  4. 跨平台兼容性: DuckDB 可在 Windows、macOS 和 Linux 等不同操作系统上运行。这意味着您可以在各种环境中使用它,从个人笔记本电脑到基于云的系统。
  5. 可嵌入性: DuckDB 的突出之处在于您可以将其嵌入到应用程序中。这使其成为构建数据密集型应用程序的理想选择,在这些应用程序中,数据库需要与代码协同工作。
  6. 与数据格式的互操作性: DuckDB 支持 CSV、Parquet 和 JSON 等多种数据格式。这使其能够轻松地融入现有的数据管道和存储系统。

DuckDB 的架构

DuckDB 的架构设计旨在最大限度地减少数据分析查询中的“抖动”。以下关键部分在其设计中发挥着重要作用:

  1. 向量化执行引擎: DuckDB 使用向量化执行引擎,它以向量而非逐行的方式处理数据。这种方法极大地提高了查询速度,因为它基于当前和迫切需要的 CPU 缓存的架构。
  2. 列式存储格式: 如前所述,DuckDB 中的数据以列式格式存储,因此非常适合分析活动。这种存储设置使 DuckDB 能够直接扫描和操作查询所需的列,从而减少 I/O 并提高性能。
  3. 内存处理: DuckDB 是内存中的。它将要处理的数据放入计算机内存中以执行计算。这种方法最大限度地减少了磁盘 I/O,并为大型数据集提供了更快的查询处理速度。
  4. 并行查询执行: 它还利用多核处理器同时运行查询,这被称为并发。这种并行处理能力提高了处理其他需要大量处理能力的查询的能力。
  5. 可插拔的存储后端: DuckDB 的设计包含两个存储系统,允许它与不同的数据库类型进行交互。例如,它可以与云中的对象存储进行交互。

将 DuckDB 与 Python 集成

最终,随着系统之间的连接已经建立,DuckDB 将继续成为熟悉 Python 生态系统的数据科学家和专家的强大工具。DuckDB 提供的 Python 包在与数据库交互方面非常友好。这使用户能够在 Python 脚本、Jupyter Notebooks 或其他类似接口中,通过 SQL 查询数据、处理数据并利用 DuckDB 的性能优势。

安装

首先,在 Python 中安装 DuckDB。您可以使用 pip 安装 DuckDB Python 包

此命令将安装 DuckDB 包及其依赖项,并允许您立即在 Python 环境中开始使用 DuckDB。

创建和管理数据库

DuckDB 被设计为与 Python 脚本在同一个进程中运行,这意味着您可以在脚本内部创建和操作 DuckDB 数据库。以下是设置新 DuckDB 数据库的方法:

在内存中设置一个新的 DuckDB 数据库

设置表并添加数据

获取数据

输出

 
[(1, 'Alice', 30), (2, 'Bob', 25), (3, 'Charlie', 35)]   

此示例用于说明如何在 DuckDB 数据集中创建表、插入数据以及从中选择数据 - 所有这些都在内存中进行 - 只需几行 Python 代码。这种易用性仍然是 DuckDB 最强大的功能之一。

查询数据

使用 DuckDB,您可以获得物理表扫描支持,并在 Python 中运行大多数 SQL。您可以利用 DuckDB 的性能增强功能执行聚合、JOIN 和窗口函数。

运行聚合查询

连接表

输出

 
Average age: 30.0
[('Alice', 'Engineer'), ('Bob', 'Artist'), ('Charlie', 'Doctor')]   

这个模型展示了 DuckDB 如何很好地处理复杂的 SQL 任务,使其成为数据分析项目的关键工具。

与 Pandas 的互操作性

关于与其他框架的集成,我想强调的是,DuckDB 与 Python 环境的集成在与 Pandas 集成时表现最佳。DuckDB 可以与 Pandas DataFrame 交换数据,让您能够轻松地在 DuckDB 和 Pandas 之间转移信息。

创建 Pandas DataFrame

将 DataFrame 插入 DuckDB

查询表并将结果返回为 DataFrame

输出

 
id name age
0 1 Alice 30
1 2 Bob 25
2 3 Charlie 35   

此示例演示了如何创建 Pandas DataFrame,将其构造为 DuckDB 表,然后查询该表以将结果作为新的 DataFrame 返回。您可以利用 DuckDB 的速度和 Pandas 的响应能力,从而能够管理和分析数据。

处理大型数据集

因此,DuckDB 最重要的能力就是处理海量数据。事实上,许多进程内数据库在处理数据方面会遇到困难;相比之下,DuckDB 更侧重于可扩展的工程设计。当在 Python 中处理大数据时,这一点尤其重要,因为标准方法可能需要分布式计算等复杂技术。

例如,DuckDB 可以搜索大型 CSV 文件,而无需将所有数据加载到内存中。

查询大型 CSV 文件

输出

 
Number of rows in the dataset: 100000   

这种无需额外内存即可处理大型数据集的能力,使 DuckDB 成为 Python 中进行数据分析的关键工具。

DuckDB 在 Python 中的用例

因此,DuckDB 的独特功能集使其适用于各种数据分析和科学计算任务。一些常见的用例包括:

  1. 交互式数据分析: 用户需要探索和查询数据以进行戏剧性的、手动的数据分析,这使得 DuckDB 的内存处理和强大的 SQL 引擎非常有用。
  2. 数据科学管道: 可以说,DuckDB 在数据科学框架中被定位为一个高速 SQL 引擎,专为数据操作、分组和数据转换而设计。
  3. ETL(提取、转换、加载)流程: DuckDB 可用于执行 Python 脚本中的 ETL 操作,这些脚本可以从各种源加载数据、对其进行转换并以不同格式导出。
  4. 嵌入式分析: 对于需要在应用程序代码中集成分析功能的应用,DuckDB 提供了一个基本且高效的解决方案。
  5. 大数据分析: 因此,如果使用像 Parquet 这样的列式存储,并且与 Python 环境中的其他工具结合使用,DuckDB 可以被认为是大数据分析工作的宝贵解决方案。

下一个话题Dynamodb-with-python