DuckDB Engineering Blog

9 篇内容

技术文章DuckDB Engineering Blog

DuckDB and Hugging Face: Querying Datasets Directly

文章介绍 DuckDB 通过 hf:// 协议直接查询 Hugging Face Hub 数据集的集成方案。自 v0.10.3 起,DuckDB 在 httpfs 扩展上支持 hf:// 路径,可把数据集仓库解析为 CSV、JSONL 或 Parquet 文件,无需先下载即可用 SQL 读取,并支持通配符扫描多文件、列裁剪、@ 版本固定和 ~parquet 分支。文章给出探索数据集、过滤采样、基准评测、与自有表连接和可复现分析等典型用例,还说明私有/门控数据集可通过 Secrets Manager 配置 token。边界在于公共数据集开箱即用,重复查询建议物化为本地表,整体更偏重官方用法与操作指南,未深入讨论远程读的性能模型和异常处理。

推荐收录:来源为 DuckDB 官方工程博客,提供了可直接运行的 SQL 代码、版本固定与私有数据集配置等具体证据,展示如何把 Hugging Face 数据集纳入本地 SQL 分析工作流。适合数据工程、ML 工程和需要快速探查/采样训练数据的读者,方法可迁移到其他远程 Parquet 数据集场景;主要不足是内容偏用法指南,缺少性能边界与失败模式的深入分析。

工具笔记DuckDB Engineering Blog

DuckDB Now Ships inside dbt v2

文章介绍 dbt v2(基于 Rust 的 Fusion 引擎)首次内置 DuckDB 适配器。作者回顾 v1 需单独安装 Python 包 dbt-duckdb,而 v2 改为 Rust 单仓 + ADBC 驱动,并自动下载缓存 DuckDB 驱动,配置一个 profile 即可运行。v2 新增 DuckLake 与 Iceberg REST 目录支持(需 use_catalogs_v2 标志)、将 dbt 元数据写成可查询 Parquet、提供原生 SQL 语义理解与列级血缘,并固定 DuckDB 版本以推下更多原生函数。迁移可先在 v1.12 用 opt-in v2 parser 验证,再用 dbt-autofix 和升级指南切换。文章偏功能与用法说明,缺少性能基准和取舍分析,适合使用 dbt/DuckDB 的数据工程读者。

推荐收录:文章给出了 dbt v2 内置 DuckDB 的配置方式、DuckLake/Iceberg catalog、Parquet 元数据查询和迁移路径,属于可操作的工具集成参考。适合数据工程师和分析工程师了解本地 dbt 工作流及 v2 迁移。需注意它偏功能公告,缺少性能与取舍验证,版本锁定可能带来后续适配成本。

技术文章DuckDB Engineering Blog

Persistent Databases in the Browser with DuckDB-Wasm and OPFS

文章介绍 DuckDB-Wasm 如何借助浏览器 Origin Private File System(OPFS)实现持久化数据库:通过 open({path: 'opfs://analytics.duckdb'}) 打开数据库文件,数据以标准 .duckdb 文件加 WAL 的形式落盘,可跨页面刷新和浏览器重启存活,无需 IndexedDB 封装或应用层序列化。文中给出完整代码示例,说明远程 Parquet 数据只在首次加载时通过 HTTP range 请求获取,之后由 OPFS 提供;并对比了 auto 与手动 registerOPFSFileName 两种文件处理模式在便利性和句柄开销上的取舍。持久性部分指出浏览器标签页很少被干净关闭,因此应在每批写入后显式执行 CHECKPOINT,或将 checkpoint_threshold 设为 0,否则 WAL 重放会拖慢下次打开。文章还提醒 OPFS 属于可能被浏览器回收的存储,应定位为本地缓存而非唯一数据副本,并演示了通过 OPFS API 或 COPY 到 Parquet 导出数据;同时给出仅支持单句柄、SQL 重命名受限、npm latest 版本存在路径规范化 bug 等边界。

推荐收录:这是 DuckDB 官方对浏览器内持久化数据库的机制级说明,包含可运行代码、WAL 与 checkpoint 的持久性权衡、文件句柄与版本兼容等真实约束,证据具体而非概念宣传。适合做 local-first Web 应用、浏览器端分析或 Wasm 存储选型的开发者,其中的检查点策略、缓存与真实数据源分层、导出路径等判断可直接迁移到类似离线优先系统。主要风险是 API 与版本行为仍在演进,读者需核对所固定版本与官方限制说明。

工程实践DuckDB Engineering Blog

How DuckDB Runs Recursive CTEs Faster

本文来自 DuckDB 工程博客,介绍了 v2.0 对递归 CTE 执行引擎的重构,目标是消除迭代间重复调度与重建状态的开销。核心方法是将物理算子树、预计算调度投影和可复用执行器池归查询计划所有,递归调用持有跨 epoch 的不变状态(如基于静态表构建的哈希表),每个 epoch 仅重置依赖前沿的状态,并通过精确的边界基数选择内联或并行调度。针对 USING KEY 递归,冻结键控状态以支持直接探测,内连接可用 RECURSIVE_KEY_JOIN 或部分键索引,并引入语义变化:UNION 仅转发最终发生变化的键,UNION ALL 仍转发全部候选。实验显示,在 100 万边可达性查询中延迟从 4.051 秒降至 0.095 秒,LDBC SF100 路径查询提速 6.55 倍且峰值内存下降,63 个递归基准几何均值改善 5.5%。适用边界包括:保留状态需可重复性证明,预聚合要求聚合状态可组合且无顺序依赖,宽唯一键更新场景有约 6% 的回归。

直接证据是作者为 DuckDB 核心开发者,提供了 PR 编号、EXPLAIN 分析与中位数基准对比,且讨论了语义变化与回归。适合数据库内核开发者、查询引擎研究者与对 SQL 递归性能优化感兴趣的读者。可迁移价值在于状态所有权划分、基于实测基数的自适应执行和变更键去重思想;风险是部分语义变更(UNION 改变行为)需使用者注意。

工程实践DuckDB Engineering Blog

DuckDB Table Functions in Java

文章介绍 DuckDB Java 客户端新增的纯 Java 表函数能力,允许开发者将任意 Java 可访问的数据源注册为 SQL 表,从而在单节点上完成跨远程系统与本地文件的异构查询,无需导出或中间表。作者以 MongoDB 为例,通过 DuckDBFunctions.tableFunction() 注册 mongo_query 函数,并详细说明 bind、init、apply 三个回调:bind 声明输出列,init 打开游标,apply 将数据按 2048 行向量块写入结果。文章强调该方式复用官方 Java 驱动、过滤条件下推到源端,且避免了原生扩展的构建与 JVM 崩溃风险。同时明确当前限制:表函数无法打包为 DuckDB 扩展,只能在 Java 客户端内使用;bind/init 对象生命周期需手动管理;STRUCT、LIST 等复合类型尚未支持。

文章来自 DuckDB 官方工程博客,提供了完整的表函数生命周期实现示例、与本地文件的交叉连接演示以及清晰的局限性说明,属于有深度且可直接迁移的工程实践。适合需要在 JVM 环境中将既有 Java SDK 或 JDBC 数据源接入 DuckDB 的工程师,可避开 C++ 扩展开发,降低维护风险。注意该 API 仍在演进,使用前应确认当前版本对生命周期管理和复合类型的支持。

工程实践DuckDB Engineering Blog

Chunked Query Results in the DuckDB Java Driver

文章介绍 DuckDB Java 驱动 1.5.3.0 新增的 chunked query results 功能,通过 DuckDBChunkedResult 让应用以惰性方式直接读取引擎生成的列式数据块,避免 JDBC ResultSet 逐行、逐值获取带来的开销。文章先解释了 DuckDB 的向量化执行与 JDBC 行式 API 的差异,指出传统驱动需要把 2048 行一列的数据块切片成行和单元格,导致不必要的转换成本。随后给出新 API 的使用示例,并总结了其特性:惰性拉取、列式访问、保留元数据、与 UDF 读取接口一致、使用零基索引。文章也明确列出了当前限制,包括仅支持基本类型、只适用于 prepared statement、reader 类型覆盖有限。结论强调 JDBC ResultSet 仍是大多数场景的合理默认,chunked API 面向返回大量数据且消费端也为列式的场景。

推荐收录,因为这是官方工程博客对新功能的设计与实现说明,清晰呈现了 JDBC 行式 API 与列式数据库引擎之间的适配问题,并给出了具体的新 API 用法、适用场景和当前局限。对需要在 Java 中高效消费 DuckDB 大结果集的开发者,以及关注数据库驱动和向量化执行接口设计的工程师,都有直接的参考价值。

工程实践DuckDB Engineering Blog

DuckDB v2.0: Your Database Deserves a Better Parser

本文是 DuckDB 工程团队关于 v2.0 用 PEG 解析器替换 PostgreSQL 派生解析器的深度技术说明。文章先阐明解析器在查询流水线中的角色,并区分了 DuckSQL 方言与解析器实现本身。接着指出旧的 YACC/Bison LALR(1) 解析器在扩展语法时容易引入 shift/reduce 冲突,而 PEG 通过有序选择避免了这类冲突。工程化过程中,作者重点解决了回溯导致的指数级重复工作,借助 packrat 记忆化使得恶意输入(如大量未闭合括号)的解析时间从指数级降为近乎常数,并给出实测数据。文章还演示了运行时扩展语法的方法:扩展可注册自定义规则并复用 DuckDB 既有语法与转换函数,以 Google pipe query syntax 为例展示了从语法到 AST 的完整过程。最后说明扩展 API 仍是预览,若发现现有查询行为不一致可提交 issue。该文对数据库解析器设计、语法扩展机制和解析性能优化具有长期参考价值。

本文基于真实工程改造,给出了从动机、原型到生产化的完整路径,包含 packrat 记忆化解决指数级回溯的性能对比数据,以及通过扩展点复用现有语法和转换函数的具体 API 示例。适合数据库内核、编译前端或开发者工具方向的工程师阅读。文中的运行时语法扩展思路与回溯性能治理方法可以迁移到其他解析器或语言实现;需注意扩展 API 仍为预览,兼容性验证细节未完全展开。

工程实践DuckDB Engineering Blog

Reconciling JSON in DuckDB, One Patch at a Time

本文是 DuckDB 工程博客的客座文章,介绍 DuckDB v2.0 JSON 扩展新增的四个标量函数:json_merge_patch_diff(计算 RFC 7396 merge patch 的逆)、json_deep_merge(null 表示跳过合并的递归合并)、json_normalize(递归排序键以生成规范形式)和 json_strip_nulls(递归删除 null 值键)。文章以 Atlan 的元数据同步场景为背景,展示这些函数如何组合成端到端的状态对账流程,用 SQL 单查询完成清洗事件、计算最小补丁、应用补丁和规范化哈希。作者在 50 万条合成 CDC 事件上对比了 Python 实现,DuckDB 获得 10 到 123 倍的加速,并说明性能来自 yyjson 原地操作和向量化执行。文章也明确了函数语义边界,如 SQL NULL 与 JSON null 的差异、数组元素顺序保留等。

推荐收录,因为这是一篇来自数据库核心团队的一手设计解读,包含函数语义、实现机制、组合用法和可复现基准,不是泛泛的功能介绍。对使用 DuckDB 做数据管道或 JSON 对账的工程师、数据库内核开发者都有直接借鉴价值,其 diff/merge/normalize/strip 的抽象也可迁移到其他数据处理系统。

技术文章DuckDB Engineering Blog

A Preview of DuckDB v2.0

DuckDB v2.0预览文章由核心开发者撰写,概述了即将发布的重大版本的主要特性。文章首先介绍了DuckDB作为服务器的新模式,通过Quack协议和CONNECT语句实现客户端/服务器架构,支持远程查询生产数据库。随后重点讲解了VARIANT类型的深化应用,使其能高效处理半结构化数据,并配合一系列variant_*函数。文章还介绍了触发器、丰富SQL方言(如NEAREST连接、CTE内DML、嵌套schema等)、全引擎异步I/O、大量查询性能优化(如重写递归CTE、聚合下推、分区感知规划)、新存储格式、全新PEG解析器,以及用自研实现替代ICU库带来的体积和性能优势。最后强调了稳定C API和自定义扩展仓库,使扩展编写和分发更加便捷。文章以预览形式呈现,强调细节可能在正式发布前调整,并提到部分破坏性变更。

本文是DuckDB官方工程博客的权威技术预览,内容详实,包含具体代码示例、性能基准和设计动机,展示了嵌入式数据库向客户端/服务器模式演进的关键架构决策。适合数据库内核工程师、数据分析平台开发者和对查询引擎优化感兴趣的读者。文中关于异步I/O、存储格式演进和扩展稳定ABI的设计思想具有可迁移性,但需注意各功能为预览状态,正式发布可能调整。