DuckDB是一个开源的、面向列的关系数据库管理系统(RDBMS),专为嵌入式配置中的高性能分析查询而设计。它针对在线分析处理(OLAP)工作负载,例如组合具有数百列和数十亿行的表,而非事务性(OLTP)应用。与传统客户端-服务器数据库不同,DuckDB在宿主进程内运行,使其适用于交互式数据分析、脚本化管道以及与Python等工具的集成。根据最近的统计,该项目报告每月下载量超过600万次。
该系统围绕向量化查询处理引擎构建,除C++17编译器外无外部依赖。DuckDB的SQL解析器源自Lukas Fittl的pg_query库,该库本身是PostgreSQL解析器的精简版本。数据可以存储在Apache Parquet文件或单文件存储格式中,两者均针对高效扫描和批量操作进行了优化。DuckDB还通过Emscripten编译为WebAssembly,支持在基于浏览器的分析工具中执行SQL。
历史
DuckDB最初由Mark Raasveldt和Hannes Mühleisen在荷兰的Centrum Wiskunde & Informatica(CWI)开发。两位联合创始人旨在创建一种进程内OLAP数据库,用于快速分析查询,填补了像SQLite这样专注于事务处理的嵌入式数据库所留下的空白。首个公开版本于2019年发布,1.0.0版本(代号SnowDuck)于2024年6月3日发布。
架构与特性
DuckDB使用向量化查询处理引擎,该引擎对数据批次而非单行进行操作。这种设计选择显著提高了分析工作负载的吞吐量。通过Python绑定使用时,系统可以直接将数据放入NumPy数组,并通过其他API支持其他语言。DuckDB的存储格式是单文件,专为高效扫描和批量更新、追加及删除而设计。其解析器源自PostgreSQL,保留了高度的SQL兼容性。
与其他系统的比较
DuckDB的OLAP定位意味着它不直接与Microsoft SQL Server、PostgreSQL或Oracle数据库等传统关系数据库管理系统竞争。虽然它使用SQL进行查询,但DuckDB针对无服务器应用,并在读取Apache Parquet文件或其自身存储格式时提供极快的响应。这使其成为大型数据集交互式分析的热门选择,在进程内工作负载中,它可以优于传统客户端-服务器数据库。
商业采用与治理
DuckDB被Facebook、Google和Airbnb等公司用于分析任务。合著者Hannes Mühleisen运营DuckLabs,一家支持和咨询公司,前身为DuckDB Labs。DuckLabs刻意避免风险投资资金,Mühleisen表示,“我们认为投资会迫使项目方向转向货币化,而我们更希望保持DuckDB开放并尽可能让更多人使用。”2026年8月,DuckLabs被Amazon收购,其员工加入Amazon Web Services子公司。另外,在DuckDB上构建数据平台的MotherDuck公司已筹集1亿美元资金,投资者包括Andreessen Horowitz。
独立的非营利组织DuckDB基金会持有该项目的大部分知识产权,并保护其开源状态。该基金会由慈善捐款资助,其章程确保DuckDB永久保持MIT许可证。
技术概述
DuckDB的向量化引擎按批次处理数据,为分析查询实现高吞吐量。它通过原生绑定支持C和C++以外的多种编程语言,包括Python、R、Java等。Python集成可以直接将数据放入NumPy数组,促进数据科学和机器学习工作流。DuckDB还提供与人工智能管道交互的绑定,其中快速的进程内分析查询补充了模型推理任务。
其架构支持扩展,可动态加载以添加功能。DuckDB团队维护的核心扩展包括:httpfs,用于通过HTTP、HTTPS和S3兼容存储进行远程文件访问(自v1.5起支持Azure写入);spatial,用于地理空间功能,自v1.5起内置GEOMETRY类型;iceberg,用于Apache Iceberg表读写,支持REST目录;delta,用于通过Delta Kernel集成Delta Lake;以及ducklake,一种具有ACID语义、时间旅行和模式演进的湖仓格式。超过30个社区扩展涵盖从图查询(SQL/PG)到Kafka集成和机器学习推理等用例。
与其他数据库的比较
DuckDB的OLAP重点使其区别于Microsoft SQL Server、PostgreSQL和Oracle Database等传统DBMS。虽然它使用SQL进行查询,但它针对无服务器应用,并在读取Parquet文件或其自身存储格式时提供快速响应。这使其成为交互式大型数据集分析的热门选择,尤其是在数据科学和分析环境中,它补充了现有的机器学习技术栈。它并非旨在替代OLTP系统,而是与它们并排用于分析工作负载。
采用与商业生态系统
DuckDB被Facebook、Google和Airbnb用于大规模数据分析。该项目的合著者Hannes Mühleisen运营DuckLabs(前身为DuckDB Labs),一家支持和咨询公司。DuckLabs刻意避免风险投资资金,表示投资会推动项目走向货币化,更倾向于保持DuckDB开放。2026年8月,DuckLabs被Amazon收购,其员工加入Amazon Web Services子公司。另外,MotherDuck为基于DuckDB的数据平台筹集了1亿美元资金,投资者包括Andreessen Horowitz。
DuckDB基金会
独立的非营利组织DuckDB基金会保障项目的长期维护和发展。它持有大部分知识产权,并由慈善捐款资助。基金会的章程确保DuckDB永久保持MIT许可证下的开源状态,保护项目免受商业控制。这种治理结构,加上DuckLabs避免风险投资的决策,反映了对保持技术广泛可及的承诺。
语言支持与扩展
DuckDB提供原生C和C++ API,以及Python、R、Java、Julia等语言的额外绑定。Python集成允许将查询结果直接放入NumPy数组,促进数据科学和机器学习环境中的无缝工作流。扩展系统支持树内和社区维护的模块,其中httpfs扩展通过HTTP、HTTPS和S3兼容对象存储实现远程文件访问,自1.5版本起支持Azure写入。spatial扩展提供ST_*系列的地理空间函数,GEOMETRY在v1.5中成为内置核心类型。对于湖仓场景,DuckDB分别提供iceberg和delta扩展,用于Apache Iceberg和Delta Lake表格式。
用例与性能
DuckDB常用于数据科学工作流,用户从Python解释器或Jupyter笔记本交互式查询大型数据集,并直接将结果放入NumPy数组。它也用于通过WebAssembly在浏览器中运行的分析工具。由于避免了客户端-服务器网络层的开销,DuckDB可以对存储在Parquet或其自身列式格式中的数据提供亚秒级响应。这使其成为嵌入式分析、批处理和轻量级数据转换任务的实用选择,使用户无需部署专用数据库集群即可处理大规模数据。
语言支持
除了原生C和C++ API,DuckDB还提供Python、R、Java、Node.js等语言的绑定,使其可访问各种大型语言模型开发栈和通用数据工具。Python包广泛用于交互式分析和生产管道,通常作为内存数据框的替代品,当数据集超过可用RAM时。
扩展与生态系统
扩展系统允许动态加载,无需重新编译核心引擎。社区扩展涵盖多种用例,从图查询到Kafka集成和ML推理。DuckDB团队维护几个核心扩展,官方注册表中列出了超过30个额外的社区维护扩展。该生态系统支持广泛的分析场景,包括地理空间分析、远程数据访问以及与现代数据湖格式的集成。
参考文献
- Woodie, Alex. “DuckDB Walks to the Beat of Its Own Analytics Drum.” 2024年3月5日.