ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apache DataFusion 29.0.0 版本深度解析:UDAF 签名变更、数组函数体系重构与回归聚合函数落地

Apache DataFusion 29.0.0 版本深度解析:UDAF 签名变更、数组函数体系重构与回归聚合函数落地 大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载Apache DataFusion 在 2023 年 8 月发布的 29.0.0 版本是一次包含多项破坏性变更Breaking Changes与重要功能增强的里程碑式发布。本文以 dev/changelog/29.0.0.md 记录为主线结合当前仓库源码逐一拆解 UDAF 创建接口调整、数组/列表访问表达式重构、Arrow 45.0.0 升级与 Decimal 除法语义变更、线性回归聚合函数、sqllogictests 测试框架落地等核心内容帮助你评估升级影响并快速上手新特性。版本概览29.0.0 发布于 2023-08-11是继 28.0.0 之后的一次大版本更新主要包括4 项 Breaking Changes涉及 UDAF 创建接口、数组函数命名、字段/列表访问表达式 API、Arrow 版本与 Decimal 除法语义5 项增强特性SQL 数组替换/删除函数、数组包含运算符/、sqllogictests 测试 crate、datafusion-cli多语句支持、线性回归聚合函数一批 Bug 修复如interval - timestamp运算禁用、Projection 列名查找、filter 谓词 panic、count(*)别名等大量底层重构排序保持算子sort-preserving相关配置、HashJoin 顺序修复、ExecutionPlan访问器抽取、内存记账memory accounting完善等。Breaking Changes 详解1.create_udaf参数签名变更从单类型到类型向量本版本将create_udaf函数的input_type参数由DataType改为VecDataTypePR #7096。这一变更直接影响所有使用datafusion_expr编写自定义聚合函数UDAF的开发者。当前仓库中的实际定义位于 datafusion/expr/src/expr_fn.rspub fn create_udaf( name: str, input_type: VecDataType, // 由单个 DataType 改为 VecDataType return_type: ArcDataType, volatility: Volatility, accumulator: AccumulatorFactoryFunction, state_type: ArcVecDataType, ) - AggregateUDF { let return_type Arc::unwrap_or_clone(return_type); let state_type Arc::unwrap_or_clone(state_type); let state_fields state_type .into_iter() .enumerate() .map(|(i, t)| Field::new(format!({i}), t, true)) .map(Arc::new) .collect::Vec_(); AggregateUDF::from(SimpleAggregateUDF::new( name, input_type, return_type, volatility, accumulator, state_fields, )) }升级要点原先input_type: DataType的写法需要改为向量形式例如vec![DataType::Float64, DataType::Float64]该函数要求input_type、state_type与Accumulator的实现严格匹配签名与状态类型必须一致否则运行时行为无法保证仓库中该变更的影响面可从测试用例中印证自定义聚合的参考示例见 datafusion/core/tests/user_defined/user_defined_aggregates.rs逻辑计划的 proto 往返测试见 datafusion/proto/tests/cases/roundtrip_logical_plan.rs。2. 数组函数命名体系重构array_slice/array_element取代array_trim本版本实现了array_slice和array_element并移除了array_trimPR #6936同时以 SQL 数组函数array_has、array_has_any、array_has_all替换了旧的array_containsPR #6990并新增array_repeat取代array_fillPR #7199与array_flattenPR #7239。当前仓库中这些函数的实现集中在 datafusion/functions-nested/srcarray_has.rs 中array_has、array_has_any、array_has_all的签名分别通过Signature::array_and_element(Volatility::Immutable)与Signature::arrays(2, None, Volatility::Immutable)构建即二元数组函数均为不可变Immutable函数切分与提取逻辑位于 extract.rsarray_slice/array_element相关重复与展平逻辑位于 repeat.rs。对使用者而言需要关注的是 SQL 语义层面的调整-- 旧接口29.0.0 之前 SELECT array_contains([1, 2, 3], 2); SELECT array_trim(...); -- 29.0.0 及之后的新接口 SELECT array_has([1, 2, 3], 2); -- 单个元素判断 SELECT array_has_any([1, 2], [2, 3]); -- 任一命中 SELECT array_has_all([1, 2], [1, 2]); -- 全部命中 SELECT array_slice([1, 2, 3], 2, 3); -- 按区间切片 SELECT array_element([1, 2, 3], 2); -- 按下标取元素 SELECT array_repeat([1], 3); -- 重复生成数组 SELECT array_flatten([[1, 2], [3]]); -- 数组展平3. 字段与列表访问表达式 API 人体工学改进PR #7215 与配套的 #7218、#7219、#7220 系列重构了创建字段访问field access和列表访问list access的 API新增Expr::field、Expr::index、Expr::slice构造器PR #7218替代原先较为冗长的构造方式为GetFieldAccessExpr增加构造器并补齐文档PR #7219将GetFieldAccessCharacteristic重命名并补充文档PR #7220。这一系列改动让表达式树Expression Tree在构建字段/索引/切片访问时更加直观也从侧面表明 DataFusion 在持续打磨 DataFrame 与表达式 DSL 的易用性。4. Arrow 45.0.0 升级与 Decimal 除法语义变更PR #6832 将 Arrow 依赖升级至 45.0.0并同步引入了 Datum Arithmetic标量值直接参与算术运算机制同时改变了 Decimal 除法的语义。这是 29.0.0 中影响面最大的底层变更之一Decimal 除法除法结果不再按旧的固定精度/标度规则推导而是遵循 Arrow 45.0.0 的 Datum 算术语义重新定义精度与标度涉及 DECIMAL 类型的除法结果可能随之变化同一时期还补充了更多 Decimal256 类型强制转换PR #7047并将Decimal256纳入ScalarValuePR #7048Decimal 256 位大精度支持在此版本中进一步完善。如果你的业务 SQL 中存在高精度 Decimal 除法运算升级后应重点回归验证精度与舍入行为。新特性聚焦线性回归聚合函数家族regr_*PR #7211 引入了完整的线性回归聚合函数族其实现位于 datafusion/functions-aggregate/src/regr.rs。从源码看该家族共包含 9 个函数全部以(Float64, Float64)签名注册为不可变聚合Signature::exact(vec![DataType::Float64, DataType::Float64], Volatility::Immutable)函数语义以Y k*X b拟合为例regr_slope(Y, X)最小残差平方和RSS拟合下的斜率 kregr_intercept(Y, X)最小 RSS 拟合下的截距 bregr_count(Y, X)两表达式均非空的输入行数regr_r2(Y, X)决定系数 R²Y 中可由 X 解释的方差比例regr_avgx(Y, X)自变量 X 的平均值regr_avgy(Y, X)因变量 Y 的平均值regr_sxx(Y, X)X 与其均值偏差的平方和regr_syy(Y, X)Y 与其均值偏差的平方和regr_sxy(Y, X)X、Y 偏差乘积之和其中regr_slope是最先落地的一个PR #7135其余 8 个随后补齐PR #7211。聚合状态通过make_udaf_expr!宏批量生成回归测试覆盖于 datafusion/sqllogictest/test_files/aggregate.slt。典型用法-- 拟合 y k*x b SELECT regr_slope(y, x), regr_intercept(y, x), regr_r2(y, x) FROM regression_data;数组包含运算符与PR #6885 新增了 PostgreSQL 风格的数组包含/被包含运算符SELECT [1, 2, 3] [1, 2]; -- true左数组是否包含右数组 SELECT [1, 2] [1, 2, 3]; -- true左数组是否被右数组包含该特性与上述array_has_any/array_has_all函数互为补充分别覆盖运算符风格与函数风格的数组包含判断。sqllogictests crate新的测试框架PR #7134 新增了独立的sqllogictestscrate现位于 datafusion/sqllogictest这是 29.0.0 在工程化层面的重要投入引擎侧支持多种后端datafusion_engine见 datafusion/sqllogictest/src/engines/datafusion_engine/runner.rs、postgres_engine见 datafusion/sqllogictest/src/engines/postgres_engine/mod.rs以及 Substrait 往返测试引擎测试文件按.slt格式组织于 datafusion/sqllogictest/test_files覆盖 aggregate、scalar、math、expr 等大量 SQL 场景该版本同时将原有information_schema的 Rust 测试迁移至 sqllogictestsPR #7050后续版本持续把测试收敛到该框架。datafusion-cli支持多语句输入PR #7138 让datafusion-cli可以一次性接受并执行多条语句如粘贴一段包含多条 SQL 的脚本并配套忽略了查询文件末尾的空白行与注释PR #7076。这使得 CLI 的批处理体验更接近标准数据库客户端相关实现位于 datafusion-cli/src。其他值得关注的新函数与行为nanvl内置函数PR #7171实现于 datafusion/functions/src/math/nanvl.rs用于处理 NaN 值场景如nanvl(x, default)在 x 为 NaN 时返回默认值测试见 datafusion/sqllogictest/test_files/math.sltmake_array增强PR #7137、#7207支持传入列表类型列并在嵌套版本中完善了 null 处理语义unnestAPI 调整PR #7168与 DuckDB / ClickHouse 行为对齐新增preserve_nulls选项count(*)别名修复PR #7081修正了聚合投影中count(*)列别名的处理with_column_renamed大小写敏感支持PR #7063支持大小写敏感的列重命名正则表达式简化PR #7186支持化简如~ ^(ba_r|foo)$这类包含下划线的正则表达式。Bug 修复与稳定性改进本版本修复了多个会影响查询正确性与稳定性的问题禁用interval - timestampPR #7086从类型检查层面直接拒绝该无意义的运算组合避免运行时出现歧义结果修复 filter 谓词 panicPR #7126修复特定谓词组合下执行期 panic修复多分区错误列需求PR #7129修复多分区场景下投影列需求错误导致的错误结果Projectioncolumns_map移除名称搜索PR #7099避免列映射阶段按名称搜索带来的歧义SortPreservingMerge 内存记账PR #7130为排序保持归并算子补上内存占用统计配合MemoryReservation::{split_off, take, new_empty}PR #7184让内存限制memory_limit机制覆盖更完整压缩相关测试在--no-default-features下跳过PR #7172修复了禁用默认特性时测试失败的问题。底层重构与性能优化29.0.0 还包含大量架构级重构这些改动为后续版本的执行引擎演进奠定基础排序保持算子配置化PR #7164新增 config 选项允许有限度地使用排序保持算子交由用户权衡收益与内存开销HashJoin 顺序修复PR #7155与 join 排序等价性工具函数抽取PR #7167统一了 join 输出排序的推导逻辑ExecutionPlan访问方式统一PR #7175新增ExecutionPlan::file_scan_config避免大量依赖类型向下转换downcasting来获取文件扫描配置模块拆分AnalysisContext移出physical_exprPR #7127、ExecutionPlanVisitor独立成模块PR #7236、streams 移出physical_planPR #7234、Partitioning与Distribution移入physical_exprPR #7238弃用batch_byte_sizePR #7245批次字节大小计算的旧接口被标记弃用with_inputs()复用原始 schemaPR #7069与with_preserve_order参数化PR #7231减少重复 schema 计算plan_err!错误宏PR #7115统一了 plan 阶段错误构造方式基准测试工具整理创建dfbench并拆分 TPCH benchmark runnerPR #7054、为 benchmark runner 加入 ClickBench 查询PR #7060、bench.sh默认只跑 5 次迭代PR #7189。升级注意事项总结综合来看从 28.0.0 升级到 29.0.0 时最需要关注的是以下四点自定义 UDAFcreate_udaf的input_type参数必须从DataType改为VecDataType参考 datafusion/expr/src/expr_fn.rs数组 SQL 函数array_trim、array_contains、array_fill已被移除分别迁移到array_slice/array_element、array_has/array_has_any/array_has_all、array_repeatDecimal 除法语义Arrow 45.0.0 升级后Decimal 除法的精度/标度推导发生变化涉及金融或高精度计算的查询需重点回归表达式 APIExpr::field、Expr::index、Expr::slice与GetFieldAccessExpr构造器的引入意味着程序化构建字段/列表访问的写法已更新。同时29.0.0 带来的回归聚合函数族regr_slope等 9 个函数、数组包含运算符、nanvl、sqllogictests 测试框架与datafusion-cli多语句支持都是值得在统计分析与工程化实践中直接采用的新能力。相关函数实现、测试与使用示例均可从上述仓库路径中进一步查阅。赞分享大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载相关推荐Apache DataFusion 28.0.0 版本解析数组函数矩阵升级、编码函数落地与执行计划 Graphviz 可视化Apache DataFusion 28.0.0 版本解析数组函数矩阵升级、编码函数落地与执行计划 Graphviz 可视化 版本信息 28.0.0 发布于大数据数据分析后端Apache DataFusion 6.0.0 版本解析并发模型重构、函数易失性体系与指标框架全面落地Apache DataFusion 6.0.0 版本解析并发模型重构、函数易失性体系与指标框架全面落地 导读 Apache DataFusion 6.0.0大数据数据分析后端face-recognition.js 模型训练与保存构建可复用的人脸识别系统face recognition.js 模型训练与保存构建可复用的人脸识别系统 face recognition.js 是一个简单的 Node.js 包提供人工智能计算机视觉上一篇今日热门项目推荐md - 微信图文排版新纪元下一篇100 个 Rust 练习上手指南8 个模块带你从语法到并发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表