Back

为什么开发者都在讨论 DuckDB

为什么开发者都在讨论 DuckDB

如果你最近关注过数据工程圈,你可能已经听说过关于 DuckDB 的热议。这个被称为”分析领域的 SQLite”的嵌入式 OLAP 数据库,正在那些需要快速本地分析能力而又不想承担传统数据仓库开销的开发者中获得广泛关注。但是,DuckDB 与市面上其他数十种数据库选项相比,究竟有何不同之处?

核心要点

  • DuckDB 是一个嵌入式 OLAP 数据库,专为分析工作负载优化,无需任何配置
  • 它可以直接查询 CSV、Parquet 和 JSON 文件,无需先加载数据
  • 该数据库与 Python、R、Node.js 无缝集成,并可通过 WebAssembly 在浏览器中运行
  • 最适合处理数百 GB 级别的数据集和单写入者场景

分析领域的 SQLite:这究竟意味着什么

DuckDB 采用了 SQLite 的成功公式——零配置、嵌入式操作、无需服务器——并将其应用于分析工作负载。虽然 SQLite 擅长事务操作(OLTP),但 DuckDB 是专为分析(OLAP)而构建的。

其技术差异化优势令人信服。DuckDB 使用向量化列式执行引擎,批量并行处理数据,而不是像传统数据库那样逐行处理。这意味着在 PostgreSQL 或 SQLite 中运行缓慢的复杂分析查询,在 DuckDB 中能以惊人的速度运行——基准测试显示性能显著提升,在某些情况下,分析查询速度比 PostgreSQL 快达 80 倍。

DuckDB 真正的独特之处在于其轻量级特性。整个数据库编译后只有两个文件——一个头文件和一个实现文件。没有依赖项,没有服务器进程,没有配置难题。只需 pip install duckdb,你就可以开始分析数据了。

对开发者有实际意义的应用场景

直接查询文件无需加载

DuckDB 的杀手级特性之一是能够直接查询数据所在位置的数据。需要分析 CSV 文件?S3 上的 Parquet 文件?JSON 日志?DuckDB 使用标准 SQL 就能处理所有这些:

SELECT * FROM 'data.csv' WHERE amount > 1000;
SELECT * FROM 's3://bucket/data.parquet' WHERE date > '2024-01-01';

无需 ETL 管道。无需数据加载。只需立即分析。

DuckDB vs Pandas:互补关系

虽然 DuckDB 与 Pandas 的比较很常见,但实际上它们可以完美配合。DuckDB 可以直接查询 Pandas DataFrames 而无需复制数据,你可以在 SQL 和 Python 之间无缝切换:

import duckdb
import pandas as pd

df = pd.DataFrame({'x': [1, 2, 3]})
result = duckdb.sql("SELECT * FROM df WHERE x > 1").df()

对于熟悉 SQL 的开发者来说,DuckDB 通常消除了学习复杂 Pandas 操作的需要。为什么要编写嵌套的 groupby 链式操作,当一个简单的 SQL 查询就能完成任务?

跨数据库连接与集成

DuckDB 可以同时连接到 PostgreSQL、MySQL 和 SQLite 数据库,实现通常需要复杂 ETL 才能完成的跨数据库查询:

ATTACH 'postgresql://localhost/prod' AS pg_db;
ATTACH 'mysql://localhost/analytics' AS mysql_db;

SELECT * FROM pg_db.users 
JOIN mysql_db.events ON users.id = events.user_id;

随处运行

DuckDB 的可移植性非常出色。它可以在 Python、R、Node.js 中运行,甚至可以通过 WebAssembly 在浏览器中运行。这意味着你可以构建完全在客户端运行的分析应用程序,消除数据处理的服务器往返延迟。

超越炒作的真实应用

主要科技公司和开源项目正在将 DuckDB 集成到他们的技术栈中。dbt 社区使用它进行本地开发和测试。Apache Superset 支持它作为数据源。数据工程团队使用它来原型化管道,然后再扩展到生产数据仓库。

MotherDuck 的出现——一个基于 DuckDB 构建的托管云服务——标志着市场的信心。MotherDuck 由前 Google BigQuery 领导者创立,获得了 4750 万美元的融资,它将 DuckDB 的能力扩展到云端,同时保持其简洁性。

DuckDB 的优势所在(以及不适用的场景)

DuckDB 擅长:

  • 对数百 GB 级别数据集的分析查询
  • 原型开发和临时分析
  • 在应用程序中嵌入分析功能
  • 无需基础设施的本地数据处理
  • 日志分析、数据质量检查和特征工程

它不适合:

  • 高并发事务工作负载(请使用 PostgreSQL)
  • 需要复杂并发控制的多写入者场景
  • PB 级企业数据仓库(请使用 Snowflake 或 BigQuery)

扩展生态系统

DuckDB 的扩展系统在保持核心轻量级的同时增加了强大的功能。扩展支持从地理空间查询到机器学习操作、HTTP/S3 访问以及专用文件格式支持等各种功能。社区扩展进一步扩展了功能,使 DuckDB 能够适应特定领域的需求。

为什么现在很重要

向 DuckDB 的转变反映了数据工具的更广泛趋势。并非每个分析工作负载都需要云数据仓库。并非每个查询都值得承受网络延迟。随着现代笔记本电脑配备越来越强大的处理器和内存,本地优先分析的论点变得更加有力。

DuckDB 代表了在日益复杂的数据环境中回归简洁性。它并不试图取代你的数据仓库或成为统治一切的数据库。相反,它填补了一个特定的利基市场——快速嵌入式分析——并做得异常出色。

结论

对于需要将数据分析作为日常工作流程一部分的开发者来说,DuckDB 提供了一个令人耳目一新的简单解决方案。无需管理基础设施,无需配置服务器,只需纯粹的分析能力触手可及。随着数据生态系统的持续演进,DuckDB 专注于将一件事做到极致——嵌入式分析——的方法使其成为现代开发者工具包中的必备工具。

常见问题

是的。DuckDB 在多个平台上经过数百万次查询的广泛测试。主要组织在生产环境中将其用于分析工作负载,但重要的是要理解其单写入者的限制。

DuckDB 服务于不同的使用场景。云数据仓库擅长处理 PB 级规模的分析和多个并发用户。DuckDB 在本地分析、原型开发和嵌入式分析方面表现出色,在这些场景中,低延迟和简洁性比大规模更重要。

这取决于你的使用场景。DuckDB 非常适合分析工作负载和读密集型操作,但不适合高并发事务系统。将其视为现有技术栈的补充,而不是替代品。

DuckDB 具有内存效率,可以通过溢出到磁盘来处理大于 RAM 的数据集。为了获得最佳性能,建议有足够的 RAM 来容纳工作数据集,但由于其高效的基于磁盘的处理,这并非严格要求。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay