ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache DataFusion 40.0.0 版本解析:UDAF 体系重构、Parquet 数据页级统计与可插拔 SQL 规划器

Apache DataFusion 40.0.0 版本解析:UDAF 体系重构、Parquet 数据页级统计与可插拔 SQL 规划器 大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载Apache DataFusion 40.0.0 是一个以引擎内功重构为核心的里程碑版本由 64 位贡献者合入 263 个提交主要围绕聚合函数 UDAF 化、Parquet 元数据级查询加速、外部文件格式写入抽象以及用户自定义 SQL 规划这四大方向展开。阅读本文你将理解这批 Breaking Changes 对 API 使用方式的具体影响掌握数据页统计与ParquetAccessPlan带来的剪枝能力并了解如何在自定义数据源与 SQL 扩展场景中落地新的扩展点。版本概况与主线梳理40.0.0 版本延续了 DataFusion 自 38.x 起将内置聚合函数迁移为AggregateUDF的长期工程方向并在此基础上铺开了四条主线聚合函数全面 UDAF 化string_agg、bool_and/bool_or、avg、nth_value等一批内置聚合被重构为统一 UDAF 实现行为与注册方式发生破坏性变更Parquet 数据页统计能力落地Int8/Int16、UInt、Timestamp、Binary/Utf8、Date、Decimal、Dictionary 等类型陆续获得 data page 级统计提取支持为行组之外更细粒度的谓词剪枝打下基础外部文件格式写入抽象新增FileTypetrait使COPY TO可以支持用户自定义的文件格式SQL 扩展点开放用户可注册自定义AnalyzerRule、ExprPlanner会话级 SQL 规划能力进一步可插拔。Breaking Changes升级 40.0.0 前必须了解的改动聚合函数 UDAF 化StringAgg / bool_and / bool_or / Average / nth_value本版本将StringAggstring_agg、bool_and/bool_or、Averageavg以及nth_value从内置聚合实现迁移为标准的AggregateUDF。从源码结构看这些函数如今与用户自定义聚合函数共用同一套实现框架。以string_agg为例其实现位于 datafusion/functions-aggregate/src/string_agg.rs通过宏make_udaf_expr_and_func!同时生成表达式构造器与 UDAF 注册入口并实现了AggregateUDFImpltrait 的签名、文档与累加器逻辑bool_and/bool_or对应 bool_and_or.rsnth_value对应 nth_value.rsavg的迁移则见 PR #10964。对普通 SQL 用户而言这些函数的语法与语义保持不变但对 Rust API 使用者影响体现在两点原来通过expr_fn::sum、expr_fn::count等函数构造聚合表达式的路径被移除或替换为函数存根见 PR #10816、#10831请改用各函数对应的 UDAF 注册名若你自行实现了与这些函数同名的自定义聚合注册时的命名冲突与优先级行为需要重新评估参见 datafusion/expr/src/udaf.rs 中 UDAF 注册与解析逻辑。配合这次迁移Count被移动到functions-aggregatecrate并同步将最低支持 Rust 版本MSRV提升到 1.75PR #10484stddev/stddev_pop、variance、approx_median、approx_distinct、regr_*、correlation、grouping、位运算聚合BitAnd/BitOr/BitXor等也在该版本周期内陆续完成 UDAF 化。ExecutionPlan::name() 与 trait object 引用返回PR #11047 移除了ExecutionPlan::name()上的Sized约束PR #11103 将相关访问器改为返回Arcdyn ...引用而非 Arc 本身。这对实现自定义ExecutionPlan的开发者意味着 trait 方法签名更宽松但下游调用处可能需要解引用调整。Expr 别名处理与 Filter 语义收拢Filter::remove_aliases被合并进Expr::unalias_nestedPR #11001逻辑计划层面去除多余别名统一收敛为表达式方法Filter::try_new现在直接剥离表达式中的别名而不是报错PR #11307filter 构造更宽容通配符限定符类型从String改为TableReferencePR #11073涉及 schema 投影的 API 调用方需同步迁移。实现增强Parquet 数据页统计与细粒度剪枝数据页统计Data Page Statistics类型覆盖DataFusion 此前主要依赖 Parquet 文件 footer 中的行组级row group统计做谓词剪枝。40.0.0 通过StatisticsConverter来自 parquet 生态的parquet::arrow::arrow_reader::statistics::StatisticsConverter逐步补齐 data page 级统计的提取能力使剪枝可以细化到页级别数值类型Int8/Int16PR #10931、UInt 系列PR #11018、Float16/32/64PR #10982、Decimal/Decimal256PR #11138时间类型TimestampPR #11123、DatePR #11135、TimePR #11187字符与字典类型Binary/LargeBinary/Utf8/LargeUtf8PR #11136、DictionaryPR #11169、#11195、FixedSizeBinaryPR #11200其他BooleanPR #11054并修复了全 null 数据页统计PR #11295。上述能力在仓库中的落点集中在 datafusion/datasource-parquet/src/metadata.rsStatisticsConverter::try_new将ParquetMetaData中的 footer 统计转换为 DataFusion 的Statistics供行组剪枝与页级访问规划消费同时data_page_row_count_limit、data_pagesize_limit等会话配置见 datafusion/datasource-parquet/src/file_format.rs控制页级统计读取的边界。ParquetAccessPlan用户自定义行组访问计划PR #10813 让ParquetExec支持用户自定义的ParquetAccessPlan并对其select方法增加了校验。该类型定义在 datafusion/datasource-parquet/src/access_plan.rs用于指定每个行组是跳过、全扫还是只扫描某些行区间// 默认扫描全部 4 个行组 let mut access_plan ParquetAccessPlan::new_all(4); access_plan.skip(0); // 跳过行组 0 // 行组 1 中仅扫描第 100-200 与 350-400 行 let row_selection RowSelection::from(vec![ RowSelector::skip(100), RowSelector::select(100), RowSelector::skip(150), RowSelector::select(50), RowSelector::skip(600), ]); access_plan.scan_selection(1, row_selection); access_plan.skip(2); // 跳过行组 2行组 3 保持全扫这一机制常与外部索引配合文件级RowSelection可通过PartitionedFile::with_extension附加到ParquetRowSelection上由 DataFusion 在打开文件时按行组元数据拆分仓库配套的测试与示例见 datafusion/core/tests/parquet/external_access_plan.rs 与 advanced_parquet_index.rsPR #10701 引入。剪枝路径的整合与统计性能优化PR #10802 将 Parquet 行组剪枝收敛为单次PruningPredicate::prune调用并更新了StatisticsExtractorAPI减少元数据读取开销PR #10932 提升 Parquet 统计转换性能PR #11319 针对 Binary/String/Boolean 数组优化统计转换PR #10946 修复了缺失列时StatisticsConverter的 counts 计算PR #10973 让row_group_row_count返回Option更精确表达未知行数语义。外部文件格式与 COPY TOFileType trait 抽象PR #11060 为COPY TO引入FileTypetrait使得写出端不再被内置格式绑死。trait 定义在 datafusion/common/src/file_options/file_type.rspub trait FileType: GetExt Display Send Sync { fn as_any(self) - dyn Any; }它通过GetExt提供扩展名如.parquet、.csv并允许as_any下转型到具体实现。在规划层ContextProvider::get_file_type见 datafusion/expr/src/planner.rs根据扩展名解析COPY语句对应的文件类型注册新格式后即可让COPY TO写出自定义格式文件。仓库文档同步补充了自定义文件格式的COPY TO示例PR #11174相关实现与测试见 datafusion/datasource/src/file_format.rs 与 datafusion/sql/tests/common/mod.rs。SQL 扩展点AnalyzerRule、ExprPlanner 与 SessionContext 增强会话级 AnalyzerRule 注册PR #10849 为SessionContext新增add_analyzer_rule方法可向会话状态注入自定义分析规则。实现见 datafusion/core/src/execution/context/mod.rsSessionContext::add_analyzer_rule委托给SessionState。配套的独立示例演示了用AnalyzerRule实现行级访问控制PR #11089是构建多租户数据过滤的实用范本。用户自定义 SQL PlannerExprPlannerPR #11180 引入用户自定义 SQL planner API经多轮迭代#11180 → #11208 → #11253 → #11296 → #11338定型为ExprPlanner开发者可实现ExprPlanner接口将自定义 SQL 函数表达式映射为 DataFusion 逻辑表达式并通过FunctionRegistry/SessionState注册。规划器接口位于 datafusion/expr/src/planner.rs仓库内置了extract、position、substring、create_struct/create_named_struct、sql_substring_to_expr等一批参考实现见 datafusion/functions/src/core/planner.rs、datafusion/functions/src/datetime/planner.rs、datafusion/functions/src/unicode/planner.rs测试见 datafusion/core/tests/user_defined/expr_planner.rs。UDTF 与 SQL 前端PR #11071 允许在SessionContext中访问/注册表函数register_udtf对应 datafusion/core/src/execution/context/mod.rs 中的RegisterFunction::Table分支PR #11088 新增独立 SQL 前端示例展示从 SQL 文本到逻辑计划的完整规划链路。查询正确性与算子修复本版本在 Join、窗口、子查询与数学函数上修复了一批影响正确性的缺陷Join修复带 join filter 的 SMJ outer join 错误 null 行PR #10892修复 OR 条件下 LEFT JOIN 求值错误PR #11203通过 anti join 支持NOT field IN (subquery)PR #10936HashJoin 在 Right join 时可保留右端排序PR #11276修复嵌套类型上的 hash joinPR #11232修复 LEFT SEMI filtered join 的流式行并发问题PR #11041。窗口内置窗口函数参数解析更宽容PR #11199Substrait 窗口支持 rows bounds 并校验测试计划可执行性PR #11278。子查询与 CTE修复子查询内定义的 CTE 越界逃逸问题PR #10954。数学函数gcd 负值PR #11099、gcd/LCM 溢出PR #11131、#11057、#11036、pow/阶乘/取负溢出PR #11124、#11134、#11084等均改为返回错误而非 panic。Substrait 互操作增强作为跨引擎查询计划交换协议Substrait 支持在本版本继续完善Join 消费端支持重复列名PR #11049并通过临时重命名规避冲突PR #11329新增Map类型转换PR #11129、struct 与 list 元素可空性忽略PR #10874、#11130、窗口函数复合名支持PR #11163ParquetExec 简单 select 的 Substrait 往返PR #10949以及 TPCH 集成测试逐步覆盖 tpch_1 ~ tpch_5PR #10842、#11234、#11298、#11311Substrait 依赖升级至 0.36.0PR #11328。其他值得关注的工程改动SQL 语法支持 DuckDB 风格 struct 语法PR #11214、substring作为substr别名注册为 UDFPR #11277、数组运算符在 parser 层改写为函数PR #11101、unnest支持递归与 filter 下推PR #11062、#10974、#11017。规划性能CommonSubexprEliminate通过减少 LogicalPlan/Expr 克隆带来约 2-3% 规划提速PR #10835并优化标识管理再提速约 10%PR #10473同时增强短路与 volatile 表达式处理PR #11197、#11265OptimizerRule::try_optimize被弃用并获得默认实现PR #11022、#11059。统计与类型min_statistics/max_statistics改为辅助函数PR #10866DFSchema::datatype_is_logically_equal公开PR #10867ScalarValue::Map实现PR #11224Float16 支持增强PR #11156。CLI 与示例CliSessionContexttraitPR #10890、PoolType参数处理重构PR #10940、基于 DataFusion 结构的 SQL 分析示例PR #10938、SQL 基础查询示例迁移至用户指南PR #11217。构建与依赖Arrow 升级至 52.1.0PR #11302sqllogictest 升级至 0.21PR #11189多 crate 启用clone_on_ref_ptrclippy 检查。升级建议与版本影响小结对于从 39.x 升级的开发者建议按以下顺序处理兼容性问题检查自定义聚合凡与string_agg、bool_and/bool_or、avg、nth_value、stddev、variance、approx_median等重名的注册或直接引用内置expr_fn::sum/count的代码需切换到 UDAF 注册与调用方式检查自定义ExecutionPlan适配name()去除Sized约束与Arc引用返回的新签名若使用Filter构造确认别名处理行为变更不再报错而是剥除别名关注 Parquet 侧若依赖行组剪枝行为可进一步利用数据页统计与ParquetAccessPlan获得更细粒度的跳过能力新扩展场景优先采用FileType、ExprPlanner、add_analyzer_rule等官方扩展点而非修改内置逻辑。完整的提交明细与贡献者名单见 dev/changelog/40.0.0.md各 PR 对应代码可在仓库相应 crate 中进一步查阅如 datafusion/functions-aggregate、datafusion/datasource-parquet/src、datafusion/expr/src/planner.rs。赞分享大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载相关推荐Apache DataFusion 39.0.0 版本全解析UDF 体系重构、Parquet 统计提取与规划性能优化Apache DataFusion 39.0.0 版本全解析UDF 体系重构、Parquet 统计提取与规划性能优化 Apache DataFusion 39大数据数据分析后端Apache DataFusion 38.0.0 版本深度解析UDAF 重构、TreeNode 规划提速与 Parquet Bloom Filter 默认开启Apache DataFusion 38.0.0 版本深度解析UDAF 重构、TreeNode 规划提速与 Parquet Bloom Filter 默认开启大数据数据分析后端Argo CD 跨命名空间管理 Applicationargocd-server 集群级 RBAC 示例详解Argo CD 跨命名空间管理 Applicationargocd server 集群级 RBAC 示例详解 导读 本指南围绕仓库中 examples/k8s大数据数据分析后端上一篇戴森球计划工厂蓝图库3000专业设计方案解析与技术架构深度剖析下一篇Citra 3DS模拟器如何在PC上完美运行任天堂3DS游戏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表