Presto Release 0.137 版本解读位运算函数、类型系统强化与 Hive 兼容性升级【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto本文基于 Presto 官方发布说明 release-0.137.rst系统解读该版本在 SQL 引擎、类型系统、位运算函数、查询监控以及 Hive 连接器方面的核心变更。读者将掌握这一版本新增函数的具体用法与底层实现、VARCHAR(length)等类型行为变化以及如何通过hive.orc.use-column-names等配置提升 Hive 数据读取的健壮性。版本概览Release 0.137 是一次典型的引擎健壮性 连接器兼容性双线迭代。发布说明分为两个板块General Changes通用引擎变更共 10 项涵盖时间函数修复、查询计划正确性、新标量函数、新类型能力、聚合函数增强、UI 与 JDBC API 扩展。Hive ChangesHive 集成变更共 5 项聚焦数据类型安全校验、表结构合法性校验、Parquet/ORC 文件格式读取修复与配置项调整。下文按这两个板块逐项展开并结合仓库源码与测试用例进行印证。通用引擎改进修复current_date的时区正确性发布说明指出修复current_date在所有时区下返回正确结果的问题。此前current_date在部分时区下可能返回错误的日期值。当前实现位于 DateTimeFunctions.java 中该文件集中了 Presto 的日期时间标量函数实现current_date的结果与会话Session所绑定时区严格相关。对于多时区部署的集群该修复消除了跨时区查询中常见的日期错一天类问题。修复标量子查询计划错误修复标量子查询使用GROUP BY、DISTINCT或JOIN时生成无效执行计划的问题。这是查询优化器优化器位于presto-main-base模块的修复当标量子查询内部包含上述聚合/去重/连接算子时旧的计划生成逻辑可能产出无法执行的计划树。修复后此类子查询可正常参与外层表达式的求值。禁止创建含UNKNOWN列类型的视图不再允许创建列类型为UNKNOWN的视图。UNKNOWN类型在 Presto 中用于表示无法推断的字面量类型如裸NULL。此前如果以SELECT NULL直接创建视图可能生成一个列类型为UNKNOWN的视图导致后续查询在类型解析阶段出现歧义。0.137 起该操作会被拒绝开发者需要显式将NULL转换为具体类型如CAST(NULL AS BIGINT)。表达式优化器去除冗余操作改进表达式优化器去除部分冗余运算。例如常量折叠、恒等运算消除、重复子表达式合并等场景下优化器生成的中间表达式更精简从而减少运行时求值开销。该优化位于表达式重写与计划优化链路中属于透明的性能改进无需用户侧配置。新增五个位运算函数0.137 引入了一组新的标量位运算函数全部实现在 BitwiseFunctions.java 中函数签名语义核心实现bit_countbit_count(x, bits) - bigint统计x的补码表示中置位1的个数Long.bitCount(num mask)bitwise_notbitwise_not(x) - bigint按位取反补码算术~numbitwise_andbitwise_and(x, y) - bigint按位与补码算术left rightbitwise_orbitwise_or(x, y) - bigint按位或补码算术left \| rightbitwise_xorbitwise_xor(x, y) - bigint按位异或补码算术left ^ right以bit_count为例源码中体现了两个关键约束BitwiseFunctions.java#L39-L53bits取值必须在 264 之间否则抛出INVALID_FUNCTION_ARGUMENT输入数值必须能用指定的bits位数表示即num须落在[~(2^(bits-1)-1), 2^(bits-1)-1]区间内否则同样报错这保证了结果的语义与 Java 中Long.bitCount一致。官方函数文档 bitwise.rst 给出了可直接运行的示例SELECT bit_count(9, 64); -- 2 SELECT bit_count(9, 8); -- 2 SELECT bit_count(-7, 64); -- 62 SELECT bit_count(-7, 8); -- 6 SELECT bitwise_and(48, 24); -- 16 SELECT bitwise_or(48, 24); -- 56 SELECT bitwise_xor(48, 24); -- 40 SELECT bitwise_not(-10); -- 9这些函数在权限掩码合并、标志位解析、布隆过滤器位图操作等场景中非常实用。此外仓库中还提供了配套的聚合版本bitwise_and_agg与bitwise_or_agg例如 BitwiseAndAggregation.java 通过NullableLongState状态在输入/合并阶段逐值执行运算可将整列的标志位聚合为一个值SELECT bitwise_and_agg(flags) AS result FROM permissions;approx_distinct支持VARBINARY输入approx_distinct聚合函数新增对VARBINARY输入的支持。approx_distinct基于 HyperLogLog 算法实现底层状态类为HyperLogLogState见 DefaultApproximateCountDistinctAggregation.java。在此之前对二进制大对象如哈希值、指纹、加密摘要做去重计数需要先转换为其他类型0.137 起可以直接对VARBINARY列调用SELECT approx_distinct(binary_fingerprint) FROM events; -- 也可指定最大标准误差 e0.004 e 0.02 SELECT approx_distinct(hash_value, 0.01) FROM clickstream;更完整的用法示例见 aggregate.rst 中的approx_distinct章节。UI 查询详情页新增创建时间Presto Web UI 的查询详情页新增查询创建时间create time展示。这使运维人员可以直接在 UI 上看到查询的发起时刻便于结合开始时间、结束时间计算排队与执行耗时定位慢查询。新增VARCHAR(length)类型支持引入VARCHAR(length)类型即带长度约束的可变字符串类型。在此版本之前Presto 的VARCHAR不带长度语义0.137 起可以在表定义、CAST中声明长度上限CREATE TABLE users ( name VARCHAR(64), email VARCHAR(255) ); SELECT CAST(hello AS VARCHAR(10)); -- hello需要说明的是VARCHAR(length)的长度是上限约束而非填充语义——存储时不会把字符串填充到指定长度只在类型系统中记录该上限供列定义、函数签名与类型兼容性校验使用。按阶段stage跟踪峰值内存使用新增按执行阶段stage维度的峰值内存跟踪。此前集群级与查询级内存统计无法细分到 stage0.137 起每个 stage 独立记录其峰值内存用量并可通过查询详情UI 或system.runtime.queries系统表查看。该能力为定位分布式查询中的内存热点例如某个 shuffle 阶段内存暴涨提供了直接依据配合memory类连接器见 memory.properties与资源组配置可以更精细地实施内存治理。approx_percentile支持数组百分位数 double 输入approx_percentile允许使用 double 类型的输入配合百分位数数组一起使用。即此前百分位数组配合的值类型存在限制0.137 起 double 输入可以与数组形式的百分位参数组合一次性返回多个分位数SELECT approx_percentile(response_time_ms, ARRAY[0.5, 0.9, 0.99]) FROM api_logs;这在延迟、耗时的 P50/P90/P99 多分位统计场景中避免了多次扫描与多次调用。JDBC 驱动新增查询进度跟踪 APIJDBC 驱动新增用于跟踪查询进度的 API。客户端可以通过Statement层的新接口周期性地获取查询的已处理进度信息为长查询的前端进度展示、取消策略与超时判断提供了标准入口。相关实现位于 presto-jdbc 模块。Hive 集成改进禁止类型不匹配的插入不再允许向 Hive 表插入与 Hive 列类型不匹配的数据。发布说明给出了典型反例此前向 Hive 的INT列写入BIGINT数据Presto 会照常写出文件但该文件内容与表/分区声明的类型不一致导致 Hive 侧无法正确读取。0.137 起写入前会校验 Presto 列类型与 Hive 元数据中的列类型是否一致不匹配时直接拒绝插入。这一改动将写后不可读的隐性故障前移为写入时的显式报错。创建表/CTAS 校验分区键位置对CREATE TABLE与CREATE TABLE ASCTAS增加校验分区键必须是表结构的最后几列且顺序必须与表属性partitioned by中声明的顺序一致。Hive 的分区列语义要求分区列排在所有普通列之后此前若在中间位置声明分区列可能生成无法被 Hive 正确解析的表结构。该校验落地于presto-hive连接器的建表逻辑中确保产出的表与 Hive 的分区约定严格对齐。移除retention_days表属性移除retention_days表属性。该属性在 Hive 中并未被实际使用Hive 自身不消费此属性属于历史遗留的无效配置。0.137 起设置该属性会被拒绝或忽略避免用户产生设置了就能自动清理数据的误解。修复 Parquet 中MAP含 null 值的解码修复 Parquet 文件中MAP类型包含 null 值时解码出错的问题。此前当 map 的 value 或 key 为 null 时Parquet 读取可能抛出异常或返回错误结果该修复保证了嵌套 map 结构的空值语义正确涉及 presto-parquet 模块的解码逻辑。ORC 列按名称访问hive.orc.use-column-names新增按列名访问 ORC 文件的能力。默认情况下ORC 文件的列按其在 Hive 表定义中的序号位置进行访问若 ORC 文件实际记录的列名与 Hive 元数据不一致例如表经过ALTER TABLE增删列、列重命名或文件由其他系统生成序号访问可能错位。启用如下配置后Presto 将按 ORC 文件内记录的列名进行匹配# 在 Hive catalog 属性文件中启用例如 etc/catalog/hive.properties hive.orc.use-column-namestrue从源码结构看该配置在 HiveUtil.java#L1147-L1149 的getPhysicalHiveColumnHandles中生效当useOrcColumnNames为 false 时物理列按序号对齐为 true 时则依据 ORC reader 解析出的OrcType列表与列名进行映射相关调用链见 OrcAggregatedPageSourceFactory.java。测试用例 TestHiveFileFormats.java#L391-L424 覆盖了两个关键场景testOrcUseColumnNames开启按名访问后用倒序的列清单读取按正序写入的 ORC 文件验证列名映射的正确性testOrcUseColumnNamesCompatibility验证兼容性回退——当 ORC 文件中只有旧式 Hive 列名_col0、_col1、_col2时系统自动回退到按 Hive 列名/序号访问保证老文件的读取不受影响。升级与验证建议针对 0.137 的变更建议升级时关注以下三点插入类型校验若现有 ETL 任务存在向 Hive 写入类型不匹配数据的历史习惯升级后任务会失败需先修正目标表结构与写入 SQL 的类型对齐建表分区列位置已有建表脚本若在非末尾位置声明分区列需调整列顺序以满足新的校验规则ORC 列名策略若集群中 ORC 文件存在列名漂移问题可在 Hive catalog 配置中开启hive.orc.use-column-namestrue并通过SHOW CREATE TABLE与抽样查询验证映射结果。小结Release 0.137 通过 15 项变更夯实了 Presto 的引擎与 Hive 集成基础位运算函数族补齐了位操作能力、VARCHAR(length)与approx_percentile数组用法扩展了类型与聚合表达力、按 stage 的峰值内存跟踪与 JDBC 进度 API 提升了可观测性而 Hive 侧的类型校验、分区键校验与 ORC 按名列访问则显著增强了生产环境的写入安全与读取健壮性。建议结合 bitwise.rst 与 aggregate.rst 的函数文档在测试环境先行验证上述新特性后再灰度上线。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
