新闻详情

新闻详情

首页 / 资讯中心 / 详情

Apache DataFusion 20.0.0 版本解析:扩展算子 API、类型级 Cast 与优化器增强全解读

发布时间:2026/9/25 5:52:46来源:尧图网络
Apache DataFusion 20.0.0 版本解析:扩展算子 API、类型级 Cast 与优化器增强全解读
大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载导读Apache DataFusion 是使用 Rust 实现的分布式 SQL 查询引擎其 20.0.0 版本发布于 2023-03-10是一次以扩展性与查询计划优化为主线的里程碑式升级。本指南以官方变更日志 dev/changelog/20.0.0.md 为骨架逐一拆解该版本中引入的 Breaking Changes、核心新特性与关键 Bug 修复并结合当前仓库源码如 extension.rs、arrow_cast.rs 等说明底层实现原理。读完本文你将掌握 20.0.0 中用户自定义逻辑节点的推荐实现方式、arrow_cast的典型用法、Parquet 谓词保留与 Limit 下推机制以及优化器在投影消除、排序键去重、位运算化简等方面的改进脉络。一、版本概览与定位20.0.0 发布于 2023 年 3 月 10 日是 DataFusion 在 19.0.0 之后的下一个大版本。从变更日志看该版本由 andygrove 手动整理PR #5551共包含3 项 Breaking changes接口与架构层面调整10 余项 Implemented enhancements扩展算子、类型转换、优化规则等12 项 Fixed bugs覆盖 Join、Window、Union、Parquet 等模块若干文档与依赖更新Arrow 升级到 34sqlparser 从 0.30 升到 0.32 等。该版本的核心主题可以概括为三句话让用户自定义逻辑算子更容易写、让类型转换与位运算更精确、让查询计划更精简。下面按主题逐个展开。二、Breaking Changes架构解耦与 API 迁移本版本的三项破坏性变更全部与 Session / Runtime 的职责划分相关反映了 DataFusion 当时正在进行的细粒度 crate 拆分重构。1. TableProviderFactories 从 RuntimeEnv 迁入 SessionStateMinor: Move TableProviderFactories up out ofRuntimeEnvand intoSessionStatePR #5477TableProviderFactories负责根据表名解析并创建TableProvider。20.0.0 将其从全局的RuntimeEnv上移到与一次会话绑定的SessionState中。这一改动的实际影响是表解析逻辑从进程级全局配置变为会话级可配置状态为多会话隔离、动态注册数据源工厂提供了更合理的作用域。如果你的代码中通过RuntimeEnv注册或获取 TableProviderFactory升级 20.0.0 时需要改为通过SessionState操作。2. SessionState 从 physical_plan 中解耦chore: Remove references from SessionState from physical_planPR #5455该 PR 移除了physical_plan模块中对SessionState的直接引用配合同期 PR #5478 将ObjectStoreRegistry迁移到独立的datafusion_executioncrate以及 PR #5432 创建datafusion-executioncrate 开始拆分执行相关代码。从源码结构看这一系列动作是 DataFusion 将执行上下文TaskContext、ObjectStoreRegistry 等从物理计划定义中剥离的早期铺垫使得物理计划更接近纯数据结构便于序列化与跨环境复用。3. 为 ExecutionProps 和 VarProvider 实现 DebugImplementDebugforExecutionPropsandVarProviderPR #5489ExecutionProps保存查询执行期间的上下文属性如查询开始时间用于now()等函数求值VarProvider则向表达式求值提供用户自定义变量。补上Debug实现后这两类对象可以参与格式化输出与断言方便调试与测试。三、核心新特性让自定义逻辑算子无痛落地20.0.0 最重要的开发者体验改进是新增UserDefinedLogicalNodeCoretraitPR #5521以及配套的name()方法PR #5450和dyn_eq/dyn_hash文档完善PR #5515。1. UserDefinedLogicalNode 的痛点扩展 DataFusion 的自定义逻辑算子需要实现 UserDefinedLogicalNode trait。该 trait 是对象安全的包含as_any、dyn_hash、dyn_eq、dyn_ord等一大堆样板方法——尤其是后三者需要手工编写向下转型再调用派生实现的胶水代码极易出错。源码注释明确给出了这类样板写法例如dyn_hash需要先use std::hash::Hash;再调用self.hash(state)dyn_eq则需要other.as_any().downcast_ref::Self()后比较。2. UserDefinedLogicalNodeCore派生即所得UserDefinedLogicalNodeCore定义见 extension.rs#L232-L315是官方推荐的实现方式其约束为pub trait UserDefinedLogicalNodeCore: fmt::Debug Eq PartialOrd Hash Sized Send Sync static { fn name(self) - str; fn inputs(self) - VecLogicalPlan; fn schema(self) - DFSchemaRef; fn expressions(self) - VecExpr; fn fmt_for_explain(self, f: mut fmt::Formatter) - fmt::Result; fn with_exprs_and_inputs(self, exprs: VecExpr, inputs: VecLogicalPlan) - ResultSelf; // 其余方法均有默认实现 // check_invariants、prevent_predicate_push_down_columns、 // necessary_children_exprs、supports_limit_pushdown 等 }关键设计在于Core 版本要求实现类型本身满足Eq PartialOrd Hash Sized因此开发者只要#[derive(Debug, PartialEq, Eq, PartialOrd, Hash)]然后仅实现业务语义方法即可。trait 末尾通过 blanket implextension.rs#L319-L389自动为任意T: UserDefinedLogicalNodeCore生成UserDefinedLogicalNode从而自动填充as_any、dyn_hash、dyn_eq、dyn_ord等样板逻辑。这正是 changelog 中 avoid having implementing some required boiler plate code 的含义。3. 配套能力name() 与必要的子表达式推导name()方法PR #5450为 trait 增加显式name()接口便于在 Explain 与调试中获取节点名称necessary_children_exprs默认返回None但可通过实现它来告诉优化器在投影下推时当前节点实际需要哪些输入列按子节点返回列索引从而让自定义算子也能参与投影裁剪。4. 端到端示例TopK 算子仓库中的 user_defined_plan.rs 是官方端到端演示定义一个TopKNode内存中只保留 Top N 元素避免全量排序实现UserDefinedLogicalNodeCore注册一个 OptimizerRule 把Sort Limit改写为TopK最后生成ExecutionPlan并产出结果。对应查询SELECT customer_id, revenue FROM sales ORDER BY revenue DESC limit 3;其初始逻辑计划为Limit: 3 → Sort → Projection → TableScan会先全量排序再丢弃而 TopK 节点只需维护大小为 3 的缓冲。测试中还演示了自定义节点的dyn_hash/dyn_eq语义相关优化器单测可见 user_defined.rs。四、类型系统增强arrow_cast 与 unsigned 字面量1. arrow_cast按 Arrow 类型而非 SQL 类型进行转换PR #5166 引入的arrow_cast函数是本版本最实用的新函数之一实现在 arrow_cast.rs。SQL 的CAST(x AS int)最终映射到 Arrow 的Int32但无法表达Int8、LargeUtf8、Dictionary或带时区的Timestamp等精确 Arrow 类型。arrow_cast(expression, datatype)以字符串形式的 Arrow DataType 作为第二个参数直接调用 Arrow 底层 cast kernel。官方文档示例 select arrow_cast(-5, Int8) as a, arrow_cast(foo, Dictionary(Int32, Utf8)) as b, arrow_cast(bar, LargeUtf8) as c; -------------- | a | b | c | -------------- | -5 | foo | bar | -------------- select arrow_cast(2023-01-02T12:53:02, Timestamp(µs, 08:00)) as d, arrow_cast(2023-01-02T12:53:02, Timestamp(µs)) as e;从实现看该函数比较特殊其返回类型取决于第二个参数的值而非类型因此需要实现return_type逻辑来解析 datatype 字符串属于 UDF 框架中少见的值驱动返回类型案例。同目录下还有配套的arrow_try_cast安全转换版本。2. Substrait 中表达 unsigned 字面量PR #5448 让 Substrait 协议能够表达无符号整数字面量。此前 unsigned literal 在 Substrait 序列化中可能被错误处理该修复保障了 20.0.0 之后通过 Substrait 传递UInt*字面量的正确性。3. 其他数值与类型修复compute_decimal_op_dyn_scalar不应把 lhs 数组 cast 成 decimal 数组PR #5465修复了 decimal 标量运算的精度路径datetime 运算改用compute_op_dyn_scalarPR #5315统一了标量/数组运算的分发逻辑IsDistinctFrom对浮点 NaN 值的处理修复PR #5446保证NaN IS DISTINCT FROM NaN语义正确interval timestamp运算支持PR #5491。五、Parquet 执行增强谓词保留与 Limit 下推1. ParquetExec 谓词保留PR #5495Parquet 行组/页级谓词裁剪依赖过滤条件可以被分解并下推到文件扫描层。20.0.0 的ParquetExecpredicate preservation 特性配合 PR #5419ParquetExec逻辑表达式到物理表达式的重构与 PR #5386parquet pruning 简化让物理执行阶段能够保留并精确应用过滤谓词避免优化后的计划丢失可用于文件裁剪的约束信息。相关实现位于 datasource-parquet 目录下。2. Parquet Limit 下推PR #5416PR #5404/#5416 实现 Parquet 的 Limit 下推当查询形如SELECT ... FROM t LIMIT n且不需要排序时Limit 可以下推到 Parquet 扫描器读取时即限制产出行数显著减少解码量。这一优化与传统的谓词下推row group skipping互补共同减少 I/O。3. 数据源层 Filter 下推策略本版本还包含一组围绕完整 filter 优先下推的改进Also push down all filters in TableProviderPR #5420把全部过滤器推给TableProviderTry to push down full filter before break-upPR #5367先尝试整体下推完整谓词再考虑拆分Fix filter pushdown for extension plansPR #5425修复自定义扩展计划的过滤器下推问题。这些改动配合 push_down_filter.rs 中optimizer_recurse重构PR #5337修复死循环使得 20.0.0 的谓词下推既更激进又更稳健。六、优化器改进更精简的计划1. 消除重复排序键PR #5462ORDER BY中出现重复键例如ORDER BY a, a时排序本身只需一次比较。该 PR 让优化器在构建排序阶段前剔除重复的排序键减少比较操作数量。2. 消除多余投影PR #5366 / #5402 / #4465围绕投影与列裁剪20.0.0 进行了组合拳eliminate unnecessary projectionPR #5366删除不改变数据的冗余投影层enhance: remove more projectionPR #5402进一步扩大可删除范围reimplement push_down_projection and prune_columnPR #4465重写投影下推与列裁剪规则实现见 optimize_projections。结合UserDefinedLogicalNodeCore的necessary_children_exprs扩展点自定义算子也能享受列裁剪收益。3. 位运算优化PR #5423 / #5476bitwise 优化规则PR #5423为位运算如x 0、x | -1、与自身运算等增加常量化简规则相关实现位于 simplify_expressions 模块expr_simplifier.rs、utils.rsunsigned 整型位运算支持PR #5476UInt*类型的按位与/或/异或/移位得以正确执行intersect 表达式优化PR #5388小改动优化 intersect 相关表达式另有一个便捷模式匹配写法PR #5537让数值类型匹配更简洁。4. ReplaceDistinctWithAggregatePR #5354新增优化规则将DISTINCT重写为等价的GROUP BY聚合计划使得去重可以利用已有的聚合执行路径哈希聚合为后续distinct 不单独维护 update/merge的重构奠定基础。七、Join 与内存管理受限 Hash Join 与跨 Join 预留1. Memory limited hash joinPR #549020.0.0 为 Hash Join 引入内存限制能力当构建侧哈希表超过memory_limit时触发溢出spill逻辑防止大表 Join 打爆内存。实现在 hash_join/exec.rs与同期新增的TaskContext配置扩展PR #5497允许为 TaskContext 设置 config extensions配套使用。2. Cross Join 的内存预留与指标PR #5339Cross Join 也获得内存预留Memory Reservation与指标Metrics支持执行期间内存使用可被观测和约束。与此相关的还有 Hash Join 支持FixedSizeBinary列PR #5461以及 Sliding Window Join 的对称哈希连接SHJPR #5322——后者为流式/滑动窗口场景的时间窗口 Join 提供支持是 DataFusion Join 家族的重要补充。3. 其他 Join 修复嵌套循环 Join 支持字面量 Join 过滤条件PR #5431hash_join 测试中布尔值改为按值传递PR #5531is_distinct对 NaN 修复PR #5446同样影响 Join 的等值判定语义。八、聚合重构与 DataFrame 增强1. 聚合的 update/merge 重构本版本开始将一批聚合算子从同时实现 update 与 merge重构为只维护单一累加路径涉及count_distinctPR #5408另修复误删的 size 代码 PR #5533并优化 size PR #5377sum_distinctPR #5474GeometricMeanPR #5469。这种重构统一了聚合状态的管理方式为后续简化聚合执行器铺路。2. DataFrame::describe 升级PR #5226 / #5435 / #5445 / #5468DataFrame 新增类 Polars 的describe方法并逐步补充mean结果PR #5435std与median结果PR #5445新增expr_fn::mean/expr_fn::median/expr_fn::stddev表达式构造函数PR #5437 / #5409针对 #5444 的 workaround 修复PR #5468。3. 窗口与类型边界修复Window frame range 值超出类型范围PR #5384修复RANGE窗口帧边界值超出数值类型范围时的错误处理timezone 传播PR #5481创建数组时正确传播时区信息避免带时区类型在构造数组时丢失语义物理表达式显示 BugPR #5387修复 misc 物理表达式格式化输出问题。九、协议、序列化与依赖升级Arrow Map 类型的 protobuf 序列化PR #5359protobuf 格式支持 Arrow Map 类型涉及 proto 相关 cratearrow 升级到 34PR #5375整个项目随 Arrow 34 更新 APIsqlparser 0.30 → 0.32PR #5457SQL 解析器升级并适配 API 变化zstd 0.11 → 0.12PR #5458并支持 Zstd 压缩文件PR #5397bytes 升级到 1.4PR #5460extension options 宏PR #5442extensions_options!宏见 config.rs用于声明扩展配置项配合 TaskContext 扩展配置使用Cargo.toml 工作区字段去重PR #5519、large_utf8遗漏补充PR #5393、UDF 零参数支持PR #5380、catalog API 使用示例PR #5326等。十、测试与工程实践迁移本版本延续 DataFusion 将单元测试迁移到 sqllogictest.slt的工程实践窗口测试迁移 part 2PR #5399谓词测试迁移PR #5374增加覆盖 cast bug 的单元测试PR #5443为 coercion 类型补充测试PR #5389新增 subquery 转 join 的测试PR #5363。这些测试文件位于 datafusion/sqllogictest/test_files 下体现了用统一 SQL 测试框架收敛回归用例的方向。结语Apache DataFusion 20.0.0 的变更日志虽然条目众多但主线清晰通过UserDefinedLogicalNodeCore大幅降低自定义算子开发门槛通过arrow_cast打通 SQL 类型与 Arrow 精确类型之间的鸿沟通过投影消除、排序键去重、位运算化简与 Parquet 谓词/Limit 下推让查询计划更精简。同时Hash Join 内存限制、Cross Join 内存预留等特性标志着执行引擎在资源可控性上迈出重要一步。对于升级用户请优先关注TableProviderFactories迁移到SessionState这一破坏性变更对于扩展开发者建议直接以UserDefinedLogicalNodeCore为起点参考 user_defined_plan.rs 的 TopK 示例。想要深入了解各特性的实现细节可在当前仓库中继续阅读extension.rs、arrow_cast.rs、push_down_filter.rs、optimize_projections 以及 hash_join/exec.rs。赞分享大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载相关推荐Apache DataFusion 31.0.0 版本解读聚合特化、写入能力扩展与执行优化全解析Apache DataFusion 31.0.0 版本解读聚合特化、写入能力扩展与执行优化全解析 本文基于 Apache DataFusion 官方变更日志大数据数据分析后端Apache DataFusion优化器扩展文档API参考Apache DataFusion优化器扩展文档API参考 一、优化器架构概述 Apache DataFusion的查询优化器采用规则式优化Rule Bas大数据数据分析后端VictoriaMetrics 中 AWS SSO SDK 模块的版本演进基于 service/sso CHANGELOG 的深度解读VictoriaMetrics 中 AWS SSO SDK 模块的版本演进基于 service/sso CHANGELOG 的深度解读 VictoriaMet大数据数据分析后端上一篇AList终极指南5分钟打造你的统一云盘管理中心下一篇78个免费公共BitTorrent Tracker一套配置解决下载慢创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LVGL中文字体显示实战:从底层原理到生成优化全攻略 2026/9/25 6:30:09

LVGL中文字体显示实战:从底层原理到生成优化全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
macOS上PyG报错Symbol not found?C++符号缺失原因与修复 2026/9/25 6:30:09

macOS上PyG报错Symbol not found?C++符号缺失原因与修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Django+MySQL协同过滤推荐系统(毕设可用) 2026/9/25 6:30:09

Django+MySQL协同过滤推荐系统(毕设可用)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Simulink入门指南:安装、建模与首次仿真全流程 2026/9/25 6:30:09

Simulink入门指南:安装、建模与首次仿真全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
大麦盒子DM4036折腾全攻略:当贝桌面安装与三网通用DNS设置 2026/9/25 6:30:09

大麦盒子DM4036折腾全攻略:当贝桌面安装与三网通用DNS设置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Keil uVision2安装使用教程:51单片机C51开发环境搭建避坑指南 2026/9/25 6:29:50

Keil uVision2安装使用教程:51单片机C51开发环境搭建避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉