跳至主要内容

DuckDB 入门:它是什么,为何值得一用?

探索 DuckDB,这款为 Python 和 R 提供支持的快速、易用的分析型数据库。了解其核心特性、适用场景,以及它如何优化数据分析任务。
Kurtis Pykes
Kurtis Pykes

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

在数据科学与分析领域,从数据中提取洞见通常涉及一系列步骤,常用 Python 及其 pandas 等库来完成。尽管功能强大,pandas 在处理超大数据集和资源密集型操作时可能会遇到性能瓶颈。

为了在强大功能与高效性之间取得平衡,DuckDB 成为一个出色的替代方案。作为一款高速、易用的分析型数据库,DuckDB 正在改变 Python 和 R 中的数据处理方式。

本文将探讨:

  • DuckDB 的独特特性与能力
  • DuckDB 相较于传统数据处理工具的优势
  • 展示 DuckDB 潜力的实用用例
  • 在 Python 与 R 中使用 DuckDB 的操作指南

读完本文,您将明白为什么无论数据规模和操作复杂度如何,DuckDB 都值得纳入您的数据分析工具箱。

DuckDB 是什么?

DuckDB 是一款免费、开源、可嵌入、进程内的关系型联机分析处理(OnLine Analytical Processing,OLAP)数据库管理系统(DBMS)。术语和缩写不少,我们来逐一解释:

  • 进程内(in-process) 意味着 DBMS 的功能在您要访问的那个应用进程内运行,而不是另起一个外部进程供应用连接
  • OLAP 表示数据库专为数据分析而设计。与之对应的是联机事务处理(OLTP)数据库,擅长处理大量事务性数据。

OLAP 与 OLTP 的主要区别在于数据的存储方式。OLTP 数据库通常按记录存储,并确保与同一记录相关的数据在内存中彼此靠近;它们也针对高效读写行进行了优化。

相比之下,OLAP 数据库通常采用列式组织,即按列组织数据。与同一列相关的数据在内存中彼此靠近,数据库也针对高效读取与计算列进行了优化。

由于 DuckDB 是 OLAP 数据库,任何存储的数据都会按列组织。此外,DuckDB 针对在数据上执行复杂查询进行了优化(例如连接、聚合、分组等)——想了解更多,请查看 SQL Fundamentals 技能路径。

如果您熟悉 SQLite,可以把 DuckDB 理解为其面向分析的“孪生版”。这也解释了 DuckDB 的流行原因——它在本地计算机上结合了 SQLite 的简洁与 Snowflake 的功能性。DuckDB 填补了分析处理所需的嵌入式数据库方案空白。

DuckDB 的关键特性

下面来看看 DuckDB 的一些关键特性。

快速的分析型查询

DuckDB 的速度非常快;对熟悉 PostgreSQL 等处理 OLAP 负载的数据库的用户来说,这可能有些出乎意料。传统上,OLAP 数据库往往响应较慢,因为它们通常需要处理更多数据。

然而,DuckDB 运行在列式向量化查询引擎之上,能够高效利用 CPU 缓存,从而加速分析型查询工作负载的响应时间。

支持 SQL 并可与多种编程语言集成

DuckDB 允许用户运行复杂的SQL 查询,并提供 Java、C、C++ 等多种 API。它还与 Python 和 R 深度集成,使用户能够高效地进行交互式数据分析;因此,您可以使用偏好的编程语言与 DuckDB 交互。它还提供了一些额外的 SQL 关键字,便于编写查询,例如 EXCLUDE、REPLACE 和 ALL。

注意:DuckDB 没有外部依赖项,因此您无需担心依赖冲突问题。

免费且开源

DuckDB 是开源项目,并拥有多位活跃贡献者,这意味着新功能与改进可以快速落地。它目前也是免费的,不过未来不一定会一直免费。

DuckDB 的使用场景

DuckDB 最常见的两个使用场景是交互式数据分析和边缘计算。

我们依次了解一下。

交互式数据分析

数据分析指的是对数据进行处理与建模的一系列步骤。其目的在于发现有用信息,以支撑结论与数据驱动的决策。

如今,许多公司雇佣数据科学家和分析师,使用 Python 与 R 等技术来开展分析工作。

对于偏好在本地开发中使用 SQL 的用户而言,DuckDB 相比 SQLite 是更好的选择;SQLite 由于缺乏面向数据分析的功能,在处理 OLAP 负载时会比较吃力。

边缘计算

像 DuckDB 这样的可嵌入式数据库,使用户能够在边缘进行数据分析。边缘计算是一种新兴的分布式计算范式,指将一系列网络与设备部署到所需位置或更靠近所需位置。

在更靠近需求地点处理数据,可以提升响应速度并节省带宽。

开始使用 DuckDB

安装 DuckDB 的步骤取决于您的环境,完整的安装指南可参见 DuckDB 文档。

总体而言,这非常简单。由于 DuckDB 是嵌入式方案,您只需几行代码即可开始。它也不需要任何服务器,且没有外部依赖。

以下是在 Python 中安装 DuckDB 的示例:

pip install duckdb==0.8.0

在 R 中则是:

install.packages("duckdb")

现在,让我们来看看一些代码示例。

在 Python 中使用 DuckDB

安装 DuckDB 后,上手非常容易。您只需在环境中 import duckdb,然后连接到一个已存在的数据库,或在需要时创建一个新数据库。

例如:

import duckdb 
connection = duckdb.connect()

由于没有向 connect() 方法传入数据库文件参数,将会创建一个新数据库。

不过,开始用 DuckDB 执行 SQL 查询的最直接方法是使用 sql() 方法。

# Source: Basic API usage - https://duckdb.org/docs/api/python/overview.html
import duckdb
duckdb.sql('SELECT 42').show()

执行该命令会在 Python 模块中全局运行一个内存数据库,并返回一个 relation(关系),本质上是查询的符号化表示。

请注意,只有在明确请求结果时,查询才会真正执行,如下所示:

# Source: Execute SQL - https://duckdb.org/docs/guides/python/execute_sql.html
results = duckdb.sql('SELECT 42').fetchall()
print(results)

"""
[(42,)]
"""

我们也可以使用 df() 方法将数据转换为 Pandas DataFrame:

results_df = duckdb.sql('SELECT 42').df()
print(results) 

"""
    42
0   42
"""

或者使用多种数据摄取方法将数据读入内存:

# Source: Python API - https://duckdb.org/docs/api/python/overview.html 
import duckdb
duckdb.read_csv('example.csv') # read a CSV file into a Relation
duckdb.read_parquet('example.parquet')# read a Parquet file into a Relation
duckdb.read_json('example.json') # read a JSON file into a Relation

duckdb.sql('SELECT * FROM "example.csv"')     # directly query a CSV file

声明:如果您在未先连接到现有数据库的情况下使用 sql() 方法,那么程序关闭后,您在文件中存储的任何数据都会丢失。可通过在本节开头介绍的 connect() 方法建立连接来避免这一点。

结语与延伸资源

DuckDB 是一款供数据专业人士(如数据科学家与分析师)使用的 OLAP 数据库,能够以快速高效的方式进行数据分析。它利用了能够在大型数据集上运行复杂查询的 SQL 查询执行引擎。

DuckDB 还与多种编程语言集成,因此您可以从自己喜欢的语言中访问它。

若想继续学习,请查看 SQL 基础速查表 以及 DuckDB 如何让 SQL 成为 DataLab 的一等公民。

Kurtis Pykes

作者

Kurtis Pykes

主题