大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载Apache DataFusion 47.0.0 是继 46.x 系列之后的一个重要版本包含 364 个 commit、来自 94 位贡献者的改动围绕查询计划可视化的 tree 格式 EXPLAIN、文件扫描层的 FileGroup 重构、溢出spill磁盘配额管理以及聚合/排序热点的性能优化四条主线展开。读完本文你将掌握这一版本的全部破坏性变更、关键新特性、性能优化原理与对应的仓库源码证据并能直接用于评估升级影响与排查实际问题。一、版本概览与升级要点47.0.0 版本以 dev/changelog/47.0.0.md 为官方发布说明改动密集且覆盖面广既有面向开发者 API 的破坏性清理也有引擎内核文件扫描、溢出、排序、聚合的架构重构与性能优化同时还伴随 Arrow/Parquet 55、object_store 0.12.0、pyo3 0.24.0 等底层依赖的大版本升级PR #15466。从仓库的发布节奏看46.0.0 → 46.0.1 → 47.0.0 的迭代非常迅速而 47.0.0 的定位是在保持 SQL 语义稳定的前提下对内核对开发者 API 做一次集中清理。对于使用 DataFusion 作为嵌入式查询引擎的项目升级前务必重点核对下面的 Breaking changes 清单因为它们大多会直接影响编译期 API 调用而非查询结果。二、Breaking changesAPI 清理与内部结构重构2.1 清理 version 40 的废弃 API本版本集中移除了自 40.0.0 之前就已标记为废弃的 APIPR #15027。典型代表包括OptimizerRule::try_optimizePR #15051ScalarUDFImpl::invoke、invoke_no_args、invoke_batch系列旧调用入口PR #15049 标记废弃PR #15123 正式移除统一收敛到invoke_batch_with_args/invoke_with_return_type等新接口ScalarValue::raw_dataPR #15016Expr::WildcardPR #14959通配符展开逻辑随后被收敛进prepare_select_exprsPR #15090、#15170View::try_new被弃用视图与流相关代码从datasource移入catalogPR #15260。这一轮清理的逻辑很清晰凡是生命周期超过 7 个版本的 API 一律移除避免长期维护两套调用路径。升级时若遇到deprecated警告应优先对照 datafusion/CHANGELOG.md 中 40~46 各版本的迁移说明逐项替换。2.2FileGroup取代VecPartitionedFile这是本版本对文件扫描层最重要的一次架构重构PR #15379、#15432、#14955引入FileGroup结构将原先散落的VecPartitionedFile统一封装从FileScanConfig中移除冗余的 statistics 字段PR #14955统计信息改由FileGroup承载新增FileGroupPartitioner用于按大小均衡重分区文件组PR #15448 文档补充并引入split_groups_by_statistics实现负载均衡PR #15473Parquet 读取器中谓词剪枝pruning predicate的创建从ParquetSource移到ParquetOpenerPR #15561让谓词构造与具体文件打开过程更贴近。在源码 datafusion/datasource/src/file_groups.rs 中可以看到FileGroup的定义它包装一个VecPartitionedFile并携带覆盖文件列 分区列全表 schema 的可选统计信息OptionArcStatistics。分区列的统计值由各PartitionedFile::partition_values精确合并而来见 datafusion/datasource/src/file_groups.rs 的注释这意味着统计信息不再是从文件元数据估算的近似值而是基于分区键值的精确聚合。FileGroupPartitionerdatafusion/datasource/src/file_groups.rs提供三个可配置参数默认值与含义如下参数默认值作用target_partitions1期望切分出的文件组数量repartition_file_min_size10 MB10 * 1024 * 1024小于该总大小的文件不触发重分区preserve_order_within_groupsfalse是否在分组时保持文件内元组顺序其repartition_file_groups方法根据preserve_order_within_groups选择两条路径datafusion/datasource/src/file_groups.rsrepartition_evenly_by_size忽略既有分组按文件有效大小effective_size把字节范围均匀切分到各分区。若总大小小于repartition_file_min_size或为 0则返回None不切分datafusion/datasource/src/file_groups.rsrepartition_preserving_order保持顺序的重分区要求现有文件组数量少于目标分区数否则无法继续datafusion/datasource/src/file_groups.rs。对使用方的影响任何直接操作VecPartitionedFile的 API 调用都需要迁移到FileGroup不过新提供的FileScanConfigBuilderPR #15352与downcast_to_source方法PR #15416可以显著降低迁移成本。2.3EXPLAIN默认格式切换为treedatafusion-cli的EXPLAIN默认输出从indent缩进文本切换为tree树状图格式PR #15427、#15706。同时EXPLAIN ... FORMAT indent | tree | json | graphviz语法得到完整支持PR #15166SQL 解析层在 datafusion/sql/src/parser.rs 等处的测试中验证了FORMAT tree的解析行为。这是查询调试体验的一次重要升级tree格式用树形结构直观展示物理计划节点的父子关系并支持长行自动换行PR #15031、统一expr打印PR #15249、#15253。本版本为几乎所有物理计划节点补齐了 tree 渲染实现包括ProjectionExec、FilterExec、HashJoinExec、SortExec、AggregateExec、WindowAggExec、RepartitionExec、UnionExec等二十余个执行节点见 changelog Other 部分的实现清单并在tree模式下不再展示逻辑计划PR #15132聚焦执行细节。升级提示如果你依赖 CLI 中以indent格式解析EXPLAIN输出的脚本升级后需改用EXPLAIN FORMAT indent显式指定格式或改造解析逻辑适配tree输出。2.4 内存消费者唯一 IDPR #15613 为每个内存消费者memory consumer引入唯一 ID。该改动服务于后续的内存限制诊断与资源统计当发生内存超限或溢出时日志与指标可以精确关联到具体算子实例而不是只有算子类型。三、性能优化从聚合热点到 TopK 与溢出路径3.1 聚合类GroupsAccumulator专项优化聚合是分析型查询的高频路径本版本针对性地为若干聚合函数实现了专用GroupsAccumulatormin/max支持Duration类型PR #15322、#15310通过 datafusion/functions-aggregate/src/min_max.rs 处Duration(...)分支接入PrimitiveGroupsAccumulator与数值类型共用同一条高效路径first_valuePR #15266与last_valuePR #15542实现了专用GroupsAccumulator位于 datafusion/functions-aggregate/src/first_last.rs并且last_value额外支持了ORDER BY参数PR #15695。源码 datafusion/functions-aggregate/src/first_last.rs 明确要求Groups accumulator must have an ordering即排序语义与分组累积深度耦合。此外topk聚合能力扩展到utf8view与largeutf8类型PR #15152并新增对应 benchmarkPR #15518。3.2 表达式求值短路与化简AND/OR短路求值PR #15462条件表达式不再无条件求值所有分支命中短路分支即可提前结束显著提升包含多个谓词的过滤场景性能x x化简为x IS NOT NULL OR NULLPR #15589利用等值自比较的语义特征让优化器能识别出非 NULL约束便于后续谓词下推与索引/统计利用整数与字符串比较去 castPR #15110unwrap cast被移入SimplifierPR #15012减少比较路径上的强制类型转换开销array_has常量折叠PR #15354当InList的 haystack 为常量时将array_hasUDF 化简为InList表达式交给等值列表求值。3.3 TopK排序前缀与早期退出PR #15563 为部分有序输入引入排序前缀sort prefix计算使 TopK 查询在输入已部分有序时可以提前退出作者在top10benchmark 上报告了约 10 倍加速该数据来自 changelog 中的 PR 描述可作为该实现的目标效果参考。配套改动包括复用interleave_record_batch优化 TopK 实现PR #15677新增sort_tpch变体下的 TopK benchmarksPR #15560SortPreservingMergeStream去除uninitiated_partitions上的 clonePR #15562、支持Utf8View单列比较PR #15348。3.4 排序与外部排序重复文件溢出与SpillManager外部排序在 47.0.0 中经历了一轮集中修复与重构修复外部排序的两个边界崩溃边角 casePR #15017与断言失败PR #15469并新增配置 fuzzer 测试PR #15501消除冗余溢出的重复文件PR #15355引入独立的SpillManager文件PR #15407并让所有溢出场景统一走SpillManagerPR #15405溢出性能改进跳过已溢出文件的重复校验PR #15454、移除读溢出文件线程中的等待PR #15654、修复命中内存限制时排序的内部错误PR #15692排序期间复用 row converterPR #15302、用状态机重构get_files_with_limitPR #15521。SpillManagerdatafusion/physical-plan/src/spill/spill_manager.rs是本次重构的核心它负责按配置把RecordBatch读写到原始文件并更新相关指标内置batch_read_buffer_capacity读盘时缓冲的批数默认 2与compression默认SpillCompression::default()两个可调项见 datafusion/physical-plan/src/spill/spill_manager.rs。其职责边界清晰只负责读写文件与指标更新溢出文件的语义解释如组内有序性由调用方算子负责datafusion/physical-plan/src/spill/spill_manager.rs。3.5 ListingTable 元数据顺序拉取修复PR #14918 修复了ListingTable顺序拉取文件元数据导致的高延迟问题。此前对大目录的列举是逐个文件串行请求改进后并行/批量获取直接改善云存储S3、GCS 等场景下列表扫描的启动延迟。四、新增功能特性一览4.1EXPLAIN FORMAT tree与计划可读性除 CLI 默认格式切换外本版本持续完善 tree 渲染ProjectionExecPR #15082、DataSourceExecPR #15029、FilterExecPR #15001、HashJoinExecPR #15079、SortExecPR #15077、AggregateExecPR #15103、WindowAggExecPR #15084、RepartitionExecPR #15137并补充输出分区数PR #15717、UnionExecPR #15278等全部支持 tree 展示extra_info解析被改进PR #15125并在计划中加入了 topk 信息PR #15547。4.2 DataFrame APIunion_by_nameDataFrame API 新增union_by_name与union_by_name_distinctPR #15489。二者在逻辑计划层由 datafusion/expr/src/logical_plan/builder.rs 的union_by_name/union_by_name_distinct方法落地Union输入节点会被无条件包裹ProjectionPR #15242确保按列名对齐而不是按位置对齐。SQL 解析侧对应实现在 datafusion/sql/src/set_expr.rs。这对来自不同 schema 的数据集合并如不同批次采集日志非常实用。4.3 溢出磁盘配额max_temp_directory_size新增配置项datafusion.runtime.max_temp_directory_size用于限制溢出查询可占用的临时目录磁盘总量PR #15520并在datafusion-cli中暴露了对应配置入口PR #15586。这一配置直接解决失控的溢出写爆磁盘问题。在源码 datafusion/execution/src/disk_manager.rs 中set_max_temp_directory_size会校验一个关键约束当磁盘管理被禁用且配额不为 0 时直接报错因为禁用磁盘管理意味着溢出路径不可用设置配额没有意义。当实际已用磁盘超过配额时错误信息会提示用户尝试增大datafusion.runtime.max_temp_directory_sizedatafusion/execution/src/disk_manager.rs。对应的单元测试覆盖了运行时动态调整配额datafusion/execution/src/disk_manager.rs与已用 80GB 超 60GB 配额的拒绝逻辑datafusion/execution/src/disk_manager.rs。4.4 新函数与类型支持array_max新增数组最大值函数PR #14470并修复了数组函数中 NULL 与类型错误的优雅处理PR #14737、空数组场景下的array_has_all/array_has_any行为PR #15039ARRAY_AGG支持DISTINCT ORDER BYPR #14413STRING_AGG功能补全PR #14412to_timestamp支持 Decimal 类型PR #15486Date 到时区感知时间戳的转换新增测试PR #15609to_char正确处理 DATE 值PR #14970ApproxDistinct支持 utf8viewPR #15200regex 字符串算子原生支持 utf8viewPR #15275窗口与SortPreservingMergeStream同步补齐 utf8viewPR #15257、#15348数组排序支持结构体PR #15527min/max聚合支持Duration前文已述Hive 分区写入支持任意 int/uint/float 分区列PR #15337。4.5 可观测性与内部机制JoinSetTracertrait 用于追踪 spawn 任务的上下文传播PR #14547并新增 tracing 回归测试PR #15673DynamicFilterSource与DynamicPhysicalExpr引入PR #15568SpawnedTask实现FuturetraitPR #15653FFI crate 新增CatalogProvider/SchemaProviderPR #15280与表函数支持PR #15581JsonSource 物理计划支持 serde 序列化PR #15311FileScanConfig.batch_size支持 serdePR #15335。4.6 Substrait 与 ProtoSubstrait 消费端修复重复WindowFunction表达式处理PR #15211、聚合count()空参数问题PR #15345、内部结构体字段重命名回归PR #15634Substrait 开始支持将TableScan.filters传播到ReadRel.filterPR #14194protobuf Java 包名重命名PR #15658。五、bug 修复专题语义正确性与边界情况5.1 SQL 语义修复count类 bugPR #15281count-bug场景下查询结果错误得到修复相关内部标记need_handle_count_bug的文档也被完善PR #15050Join 相关重复的非限定字段名导致的 schema 错误PR #15438与 schema 不匹配检查的回退PR #15580左右 semi/mark join 的 unparse 修复PR #15212无投影 join 的 unparse 修复PR #15693compound_field_access的 qualifier 标识修复PR #15153与 JOIN 条件的复合字段访问测试PR #15556窗口函数嵌套窗口函数修复PR #15033、窗口标识归一化PR #15639、nth_val等窗口函数文档示例补齐PR #15555聚合聚合边角 casePR #15457spill 后 merge 阶段 group by 列更新PR #15531类型系统有符号/无符号整数Int64vsUInt64等类型强转修复PR #15341二元运算的 map 类型合并PR #15551equals_datatype用于类型比较PR #15366Decimal 精度在 simplify 规则中的问题PR #15588零输入数组类型提升PR #15487视图ViewTable 中 union 的非法 schema 修复PR #15135、#15300。5.2 文件与扫描修复字典编码列转分区列的转换 bugPR #15652INSERT API 支持类型 castPR #15091与INSERT INTO ... SELECT行为对齐空投影在DataSourceExec的 roundtrip 问题PR #15449ParquetSource无效果指标 bugPR #15460自定义SchemaAdapter的谓词下推修复PR #15263。5.3 其他重要修复core_expressionsfeature flag 损坏修复overlay移入 core 函数PR #15217DropFunction拼写错误修复PR #15434物理计划节点递归保护PR #15600非 panic 任务错误不再被标记为内部错误PR #15109物理计划树展示的RepartitionExec输出分区数补充PR #15717。六、工程实践测试基建与依赖升级6.1 大规模迁移到insta快照测试本版本将大量测试迁移到insta快照测试框架覆盖面包括 DataFramePR #15165、#15262、physical planPR #15313、#15364、#15399、datasourcePR #15258、optimizerPR #15446、substraitPR #15444、#15480、sqlPR #15497、#15499、#15533、#15548、#15567、#15578、#15621共 7 个批次。快照测试让计划形状、输出文本的变化在代码评审阶段即可直观 diff是本次大规模 API/显示格式重构得以安全推进的关键保障。datafusion-cli也引入insta快照测试并搭建 AWS mockPR #13672。6.2 依赖与工具链Arrow/Parquet 升级到 55object_store升级到 0.12.0pyo3升级到 0.24.0PR #15466sqlparser 升级到 0.55.0PR #15183substrait 升级到 0.55.0PR #15305tokio 1.44.2、rust_decimal 1.37.1、blake3 1.8.1 等一批依赖例行更新Rust 工具链升级到 1.86PR #15625并启用used_underscore_bindingclippy lintPR #15189新增backtracefeature 到 datafusion-cliPR #14997release-nonlto构建保留调试符号PR #15350WASM 支持修复PR #15102并新增端到端 parquet 读取测试PR #15362CI 中真正运行 wasm 测试PR #15595基准测试改进clickbench 增加平均耗时统计PR #15381、#15472TPCH 支持运行指定查询PR #15467新增复杂过滤查询PR #15500。七、升级到 47.0.0 的实操建议先编译后跑测本版本的 breaking changes 集中在编译期废弃 API 移除、FileGroup替换优先用cargo check定位编译错误逐项对照 datafusion/CHANGELOG.md 迁移注意 EXPLAIN 输出变化如果 CI 或脚本解析 CLI 的EXPLAIN输出请显式使用EXPLAIN FORMAT indent或适配 tree 格式关注磁盘配额配置使用大量外部排序/溢出的生产环境建议显式配置datafusion.runtime.max_temp_directory_size防止 spill 写满磁盘注意该配置在磁盘管理禁用时不可设置非零值见 datafusion/execution/src/disk_manager.rs利用新特性union_by_name简化异构 schema 合并EXPLAIN FORMAT tree配合ANALYZE排查计划形状GroupsAccumulator优化对first_value/last_value/min/max密集的查询自动生效无需额外配置依赖版本联动若你同时使用 Arrow/Parquet 或 object_store需同步升级到 Arrow 55 / object_store 0.12.0 以匹配本版本。八、结论Apache DataFusion 47.0.0 是一个典型的内功型版本没有颠覆性 SQL 功能但通过FileGroup统一文件分组与统计管理、SpillManager收敛溢出路径、max_temp_directory_size提供磁盘配额护栏、GroupsAccumulator专项优化高频聚合、tree 格式 EXPLAIN 重塑调试体验系统性提升了引擎的可维护性与执行效率。对于计划升级的用户核心动作是核对 breaking changes、适配 EXPLAIN 输出、配置 spill 磁盘配额对于想深入源码的开发者datafusion/datasource/src/file_groups.rs、datafusion/physical-plan/src/spill/spill_manager.rs、datafusion/execution/src/disk_manager.rs 与 datafusion/functions-aggregate/src/first_last.rs 是理解本次重构的最佳起点。赞分享大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载相关推荐揭秘OctoSQL查询性能explain参数深度解析与实战优化想要让SQL查询飞起来吗OctoSQL的explain功能就是您的性能优化利器。这个强大的查询引擎不仅支持多数据源联合查询更提供了直观的执行计划可视化让您数据分析数据集成CLI后端AutoTrader高级技巧自定义指标开发与策略信号优化AutoTrader高级技巧自定义指标开发与策略信号优化 AutoTrader是一个基于Python的自动化交易系统开发平台支持从回测到优化再到实盘交易的全Apache Doris查询计划深度解析如何看懂EXPLAIN输出并优化SQL性能Apache Doris查询计划深度解析如何看懂EXPLAIN输出并优化SQL性能 Apache Doris作为一款高性能的统一分析数据库其查询优化能力备受OLAP数据库大数据实时分析上一篇NgRx性能监控使用Chrome DevTools分析状态流转下一篇从 PRD 到上线基于 easy-vibe 课程体系从零构建类 Dify 智能体编排平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
