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

发布时间:2026/9/25 5:52:48

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),仅供参考
延伸阅读

更多相关文章

2026/9/25 5:47:47

DeskcommCRM实操:销售团队从零配置永久在线客户工作台指南

最近在帮几个销售型小团队梳理客户管理流程,发现一个很现实的问题——大家缺的其实不是一套高端CRM,而是一个“能用起来、不用天天维护、打开就能干活”的客户管理工具。市面上的方案我基本都接触过:本地装客户端的、自己买服务器托管的、干脆…

2026/9/25 6:47:49

英伟达老版本驱动下载与回滚实战指南

1. 为什么必须掌握英伟达老版本驱动下载与回滚能力? 在实际运维和开发场景中,“英伟达官网如何下载老版本驱动?历史版本查找与回滚指南”不是个可有可无的冷知识,而是高频刚需。我做过三年GPU服务器集群维护,经手过20…

2026/9/25 6:47:49

RabbitMQ消息确认机制:生产端Confirm与消费端Ack实战解析

如果你维护过一个基于RabbitMQ的业务系统,多半见过这样的告警:队列里的消息在几分钟内从0涨到几十万,管理界面上的unacked数字一直往上爬,消费者进程看起来还活着,但消息就是不被消费。我印象最深刻的一次是在周五晚上…

2026/9/25 6:47:49

ROS2+Gazebo仿真Mid360与FAST-LIO:从建图到导航的完整实践

简介:基于ROS2-Gazebo搭建的导航模拟包,面向机器人自主导航的开发者与研究者,以全向移动小车为载体,集成Livox Mid360激光雷达与惯性测量单元IMU,并结合FASTLIO算法实现在室内外复杂场景中的定位与导航仿真&#xff0c…

2026/9/25 6:47:49

Excel COUNTIF函数详解:从基础到高级应用

1. COUNTIF函数基础解析COUNTIF函数是Excel中最基础也最实用的统计函数之一,它的核心功能是根据指定条件对单元格区域进行计数。这个看似简单的函数,在实际工作中却能解决80%以上的基础统计需求。1.1 函数语法与参数详解COUNTIF函数的标准语法为&#xf…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑