尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Presto 0.289 版本发布全解析:Delta Kernel 支持、Parquet 写入器默认版本调整与关键优化

发布时间:2026/9/23 20:00:37

资讯中心
01
ARTICLE

Presto 0.289 版本发布全解析:Delta Kernel 支持、Parquet 写入器默认版本调整与关键优化

Presto 0.289 版本发布全解析:Delta Kernel 支持、Parquet 写入器默认版本调整与关键优化
Presto 0.289 版本发布全解析Delta Kernel 支持、Parquet 写入器默认版本调整与关键优化【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/prestoPresto 0.289 是一次包含多个连接器增强、查询正确性修复与 C 引擎能力扩充的重要版本覆盖 Delta Lake最高支持协议版本 3.7、Iceberg 元数据维护、Hive/Parquet 写入行为变化、基于历史的优化器HBO重试机制以及 Presto C Worker 的监控指标暴露等核心方向。本文以 release-0.289.rst 为主体结合当前仓库中的源码实现与配置定义逐项解析该版本的功能细节、配置项语义与升级注意事项帮助你在升级后正确配置、快速定位行为变化。一、版本 Highlights 速览0.289 的五大核心变化如下领域变化影响Delta Connector通过新的 Delta-Kernel API 支持读取最高 Delta Protocol Version 3.7 的表解锁更新协议版本的 Delta 表读取能力数组/集合函数修复array_distinct、array_except、array_intersect、array_union、set_union、set_agg在含 null 字段的行数组或含 null 元素的数组输入时报错的问题改为使用完整的IS DISTINCT FROM语义比较Parquet 写入默认写入器版本改为PARQUET_1_0需旧行为可通过hive.parquet.writer.version PARQUET_2_0恢复Presto C Worker新增 REST API以 Prometheus Data Format 输出 worker 统计信息便于接入 Prometheus 监控体系依赖与安全Joda-Time、Airlift、avro、guava、json-path 等依赖升级修复多个 CVE 并更新时区数据其中 Delta 与 Parquet 两项变化在后续章节中有源码级别的细节支撑下面逐一展开。二、General Changes查询正确性修复与新能力2.1 数值与类型相关的正确性修复-0哈希码修复当use-new-nan-definition为 false 时double与real类型的-0哈希码计算存在 bug本版本修复。mixed aggregation 上的 count 结果错误涉及混合聚合的查询count over mixed aggregation此前可能返回错误结果已修复。timestamp with timezone 类型的 equijoin修复等值连接在此类型上的正确性问题相关改动同时催生了 SPI 中Type.equalValuesAreIdentical的引入见 SPI 章节因为 timestamp with timezone 类型的值可能存在多种表示形式。like 谓词与换行符修复 like 谓词在末尾无通配符时只能匹配 newline 的问题。array_min/array_max当首元素递归包含含 null 元素的内部数组时结果错误已修复。map_top_n确定性改为使用 key 打破平局保证函数结果确定性。stddev / variance修复输入为常量时结果不正确的问题。这些修复中use-new-nan-definition 相关语义对使用者影响最大因为 NaN 比较语义在近期版本中有较大变化详见 2.3 的警告配置。2.2 新增函数本版本新增两个函数ip_prefix_collapse()对 IP 前缀进行折叠/合并IP 前缀聚合类操作。array_split_into_chunks()将数组按指定大小切分为多个子数组chunk。2.3 新增优化与配置移除单行常量输入的 Cross Join0.289 新增一个查询优化当 Cross Join 的一侧输入是单行常量时可以移除该 Cross Join将其替换为 Project 节点从而避免一次代价较高的连接计算。该优化由会话属性remove_cross_join_with_constant_single_row_input控制默认开启。从源码可以确认该优化的完整实现链路。会话属性的定义位于 SystemSessionProperties.javapublic static final String REMOVE_CROSS_JOIN_WITH_CONSTANT_SINGLE_ROW_INPUT remove_cross_join_with_constant_single_row_input;对应的规则实现在 RemoveCrossJoinWithConstantInput.java。该规则作为迭代优化器中的一个RuleJoinNode注册核心逻辑如下模式匹配只匹配INNER类型且连接条件为空getCriteria().isEmpty()的 Join 节点即真正的 Cross Join单行常量判定isOutputSingleConstantRow沿 Project 链向下解析若最终是ValuesNode且getRows().size() 1则判定为单行常量输入常量赋值提取getConstantAssignments把ValuesNode中唯一一行各列的值与 Project 的赋值表达式一起内联成MapVariableReferenceExpression, RowExpression并通过RowExpressionDeterminismEvaluator校验所有表达式都是确定性的非确定性表达式如random()不会触发优化计划改写把 Cross Join 替换为在另一侧输入之上追加投影addProjections的 Project 节点若原 Join 带 filter则保留为 Filter 节点。规则的注释给出了直观示意将 Cross Join(TableScan, Values 单行) 改写为 Project(TableScan)其中right_field : 1的常量赋值直接下推为投影列。该优化对于形如SELECT ... FROM t CROSS JOIN (VALUES (1)) AS v(x)或带有常量谓词的查询场景收益明显。2.4 新警告机制NaN 相关的warn-on-possible-nans由于 NaN 比较语义在近期版本变化较大0.289 新增了配置属性warn-on-possible-nans与会话属性warn_on_possible_nans。开启后涉及double或real类型的除法运算与比较运算会产生警告除法是意外产生 NaN 的常见来源如 0/0、某列存在 0 值时比较运算的 NaN 语义在最近版本中发生显著变化启用该配置有助于提前发现可能受影响的计算路径。建议在升级后临时开启该警告并扫描日志确认线上查询没有依赖旧 NaN 比较语义。2.5 IGNORE NULL 子句告警本版本开始当IGNORE NULL子句被用在除lag、lead、first、last、nth value之外的函数上时会输出警告未来的版本中这类查询将直接失败。如果线上 SQL 存在此类用法建议尽早调整。2.6 Join 基数估计与广播策略改进低置信度零估计在 Join 基数估计中将低置信度的零估计值按UNKNOWN处理通过会话属性treat-low-confidence-zero-estimation-as-unknown控制。基于置信度的广播broadcast新增confidence_based_broadcast会话属性Join 中置信度更高的一侧会被放到 build 侧使估算更可靠。2.7 依赖与运行时升级组件升级版本说明Joda-Time2.12.7使用 2024a tzdata注意需同步更新 Java 运行时的时区数据如 Oracle JDK 8u381、OpenJDK 的 tzdata2024a rpm或使用 Timezone Updater ToolAirlift0.215基础设施库升级avro1.11.3修复 CVE-2023-39410guava32.1.0-jre修复 CVE-2023-2976json-path2.9.0修复 CVE-2023-1370其中 Joda-Time 的升级需要运维侧联动仅升级 Presto 还不够Java 运行时的 tzdata 若不一致可能导致时区数据不一致进而影响时间相关查询结果。另外 0.289 还新增了 dbeaver 与 superset 客户端接入文档对应 release notes 中的:doc:引用方便用户查阅第三方 BI 工具接入方式。三、Presto C Changes监控、CTE 物化与 SSD 缓存3.1 Prometheus 格式的 Worker 统计 REST APIPresto C Worker 新增 REST API可以按Prometheus Data Format输出 worker 统计信息方便直接接入 Prometheus 抓取scrape体系。这对原生执行引擎的可观测性补齐了重要一环在此之前C Worker 的内部指标难以用标准监控协议暴露。3.2 CTE 物化MaterializationC Worker 支持 CTE 物化涉及两个配置属性hive.temporary-table-storage-format临时表存储格式仅支持DWRF或PARQUEThive.temporary-table-compression-codec临时表压缩编解码器仅支持ZSTD或NONE。CTE 物化允许公共子表达式被多次引用的 CTE只计算一次并写入临时表避免重复计算。3.3 全量内存缓存周期性持久化到 SSD新增对 C Worker 将全量内存缓存周期性持久化到 SSD 的支持通过配置cache.velox.full-persistence-interval设为非零值启用。该机制可加速节点重启后的缓存预热减少冷启动对性能的影响。3.4 timestamp with timezone 查询显式失败为避免正确性问题C Worker 对包含 timestamp with timezone 的查询改为直接失败fail而不是返回可能错误的结果。这意味着在 C 执行路径上使用该类型需要等待后续版本支持。四、JDBC Changes修复autoCommit从false切换为true时失败的问题修复PrestoDatabaseMetaData.getURL返回的 URL 缺少jdbc:前缀的问题。这两个都是驱动层兼容性修复升级 JDBC 驱动后客户端行为将更符合 JDBC 规范。五、History Based OptimizerHBOChanges历史基于优化器History Based Optimizer在本版本有多项增强修复聚合节点序列化修复 Aggregation 节点在 HBO plan hash 中的序列化问题使哈希输出一致之前可能导致历史统计无法命中新增会话属性enable_verbose_history_based_optimizer_runtime_stats用于跟踪 HBO 优化器的延迟latency便于排查优化器开销新增会话属性enforce_history_based_optimizer_register_timeout强制 HBO 查询注册的最大耗时上限新增会话属性retry-query-with-history-based-optimization当查询失败且 HBO 可能对其有帮助时支持自动重试查询——即第一次失败后收集统计信息重试时利用历史优化重新生成更优计划。HBO 的核心思路是复用历史查询的执行统计行数、基数等来指导后续相似查询的优化决策本版本的重试支持把失败后借助历史统计重试变成一项自动能力。六、Hive Connector Changes6.1 Parquet 写入器默认版本调整为 PARQUET_1_0这是本版本对 Hive/Iceberg 连接器影响最大的行为变化默认 Parquet 写入器版本从PARQUET_2_0改为PARQUET_1_0。若需恢复旧行为在 Hive catalog 配置文件中显式设置hive.parquet.writer.version PARQUET_2_0在源码层面该配置对应 HiveSessionProperties.java 中的会话属性parquet_writer_versionPARQUET_WRITER_VERSION常量并通过getParquetWriterVersion返回ParquetProperties.WriterVersion枚举实际写入时由 ParquetFileWriterFactory.java 使用该版本决定生成的 Parquet 文件格式细节。写入器版本影响 Parquet 文件中的元数据与编码细节PARQUET_1_0是兼容性更广的旧版本。对于需要兼容更老读取端如旧版 Hive或追求最大生态兼容性的集群PARQUET_1_0默认值更安全若你的下游工具已依赖PARQUET_2_0的写入行为则需显式改回。6.2 信息列过滤修复与时间戳分桶修复$file_size与$file_modified_time信息列过滤此前按这两列过滤会被忽略现已修复修复时间戳分桶表的哈希计算写表时若按 Timestamp 列分桶此前哈希计算与 Hive 不兼容现改为 Hive 兼容的哈希函数新增hive.legacy-timestamp-bucketing配置与会话属性hive.legacy_timestamp_bucketing若需使用原来的与 Hive 不兼容的时间戳哈希函数可开启此开关以维持旧行为。6.3 目录列表缓存上限与跳过空文件新增hive.file-status-cache.max-retained-size配置设置目录列表缓存的最大保留字节数原hive.file-status-cache-size现已弃用deprecated。这对大目录、高分区数场景下的内存控制很重要新增hive.skip_empty_files配置跳过空文件。相关实现分散在 HiveClientConfig.java、HiveDirectoryContext.java 与各 DirectoryLister如 HadoopDirectoryLister.java、HudiDirectoryLister.java中从源码结构看该能力在目录遍历阶段即对文件大小进行判断。6.4 decimal 批量读取器新增 decimal 类型的 batch readerAdd support for decimal batch reader从源码结构推断这属于读取路径上的向量化/批量解码能力增强用于提升 decimal 列的扫描吞吐。七、Iceberg Connector Changes7.1 孤儿文件清理过程新增存储过程remove_orphan_files删除不被任何元数据文件引用的孤儿文件orphan files。孤儿文件通常产生于写入中断或快照回滚长期累积会浪费存储空间。使用方式与其他 Iceberg 存储过程一致通过CALL语句触发。7.2 元数据文件保留与清理新增两个表属性metadata_previous_versions_max保留的上一版本元数据文件数量上限metadata_delete_after_commit提交后是否删除旧元数据文件。配合使用可控制 Iceberg 表元数据目录的膨胀提交新快照后超过保留数量的旧元数据文件会被自动删除。该能力也支持Hive catalog 下的 Iceberg 表即通过 Hive Metastore 作为 Iceberg catalog 时同样生效。7.3 其他修复与优化Hive/Glue catalog 元数据刷新超时配置为 Iceberg 连接器新增针对 Hive 或 Glue catalog 的表元数据刷新超时refresh timeout的调优配置修复 Decimal 类型读取失败JDBC 客户端性能优化Iceberg 与 Delta 连接器在配合 JDBC 客户端使用时性能均有提升同一 PR 覆盖两个连接器。八、Delta Connector Changes8.1 Delta-Kernel API 与协议版本 3.7 支持本版本通过新的Delta-Kernel API支持读取最高Delta Protocol Version 3.7的表。Delta Lake 协议版本随着功能演进不断升高Presto 此前基于自研读取逻辑对高版本协议支持有限引入 Delta-Kernel 作为读取内核是提升 Delta 兼容性的关键架构性改动。8.2 分区列大小写支持新增布尔配置delta.case-sensitive-partitions-enabled默认true用于查询分区列为大写的数据。当 Delta 表数据中分区列名是大写时默认开启大小写敏感的分区匹配即可正常查询。该配置在 DeltaConfig.java 与 DeltaClient.java 中均有对应实现从源码结构看它控制分区值解析与匹配阶段是否进行大小写敏感的列名对照。8.3 JDBC 客户端性能优化与 Iceberg 相同Delta 连接器在 JDBC 客户端场景下性能提升共享 PR #22936。九、Verifier ChangesPresto Verifier用于对比两套集群查询结果的工具新增配置control.reuse-table与test.reuse-table分别允许 control 与 test 查询复用源查询的输出表避免重复创建/写入缩短校验流程--validate-string-as-double控制对 varchar 列是否应用浮点校验——当 varchar 列由浮点数 cast 而来时可用该开关启用浮点比较减少因字符串表示差异导致的误报。十、SPI Changes事件进度发布与类型相等语义10.1EventListener.publishQueryProgressSPI 的EventListener接口新增publishQueryProgress方法用于定期发布集群中查询的进度事件。配套新增配置属性event.query-progress-publish-interval指定进度事件的生成间隔默认值为 0即禁用。需要在config.properties中显式设置非零值单位为时间间隔才能启用例如event.query-progress-publish-interval10s该能力使自定义事件监听器能够获得查询的周期性进度快照适用于长查询进度展示、资源用量监控等场景。注意实现EventListener接口的第三方插件需要同步实现该新方法否则在升级后可能出现编译/加载问题。10.2Type.equalValuesAreIdenticalType接口新增equalValuesAreIdentical方法当类型的值可能存在多种表示形式如 timestamp with timezone 的多个时区表示映射到同一时刻时应重写此方法返回false。该方法的引入与前述 equijoin over timestamp with timezone 修复PR #23319直接相关——比较逻辑需要知道相等是否意味着值表示完全一致从而在哈希/去重等场景做正确取舍。十一、升级与验证建议综合 0.289 的全部变化升级时建议按以下清单逐项核对Parquet 写入行为确认下游是否依赖PARQUET_2_0写入细节若依赖则需在 Hive/Iceberg catalog 显式设置hive.parquet.writer.version PARQUET_2_0时区数据同步升级 Java 运行时 tzdataJoda-Time 已用 2024a tzdata否则时间查询结果可能不一致NaN 语义临时开启warn-on-possible-nans观察日志排查依赖旧 NaN 比较语义的查询IGNORE NULL 用法排查非窗口函数上使用IGNORE NULL的查询未来版本将直接报错事件监听器插件若使用自定义EventListener需适配新的publishQueryProgress方法安全依赖avro/guava/json-path 已修复对应 CVE升级后应复查依赖树无旧版本残留新能力验证可用remove_cross_join_with_constant_single_row_input默认开启观察常量单行 Cross Join 的消除效果Delta 用户可验证 Protocol 3.7 表读取与delta.case-sensitive-partitions-enabled对大写分区列的支持。十二、小结Presto 0.289 的核心主线可概括为三条兼容性Delta-Kernel 支持高版本协议、Parquet 写入默认回退到 PARQUET_1_0、正确性一系列涉及 NaN、时间戳、数组嵌套 null 的修复并配套 warn-on-possible-nans 等诊断手段、可观测性与自动化C Worker 的 Prometheus 指标、HBO 失败重试、查询进度事件。对于升级用户Parquet 默认版本与 tzdata 联动是两项必须人工确认的行为变化对于查询开发人员新函数、Cross Join 优化与 NaN 警告则提供了更精细的控制手段。更完整的逐条变更含 PR 编号请参阅 release-0.289.rst相关实现细节可进一步阅读上文引用的 SystemSessionProperties.java、RemoveCrossJoinWithConstantInput.java、HiveSessionProperties.java 与 DeltaConfig.java。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。