Presto Release 0.271 特性解析Distinct 聚合大块溢出、Cast 语义收紧与 Hive/Iceberg 连接器增强【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto导读Presto 0.271 是 Presto 分布式 SQL 查询引擎的一次功能与稳定性并重的版本发布核心亮点包括新增基于块大小的 Distinct 聚合溢出spill控制能力为内存压力治理提供更细粒度的手段收紧 bigint 转 varchar 的语义避免数据静默截断同时修复了一致性哈希调度下的缓存性能问题与 Join 重排优化缺陷并为 Hive、Iceberg 连接器带来多项改进。本文以官方 Release Notes 为骨架结合仓库源码逐一解析每个变更的技术原理、配置方法与升级注意事项帮助读者准确评估升级影响并正确使用新特性。一、通用引擎变更General Changes1. 修复一致性哈希调度下的缓存性能问题Release 0.271 修复了当CONSISTENT_HASHING被用作调度策略scheduling strategy时缓存性能可能受到影响的问题。在 Presto 中调度策略决定了分片split在 worker 节点间的分布方式而一致性哈希Consistent Hashing被用于提升缓存亲和性cache affinity让相同数据的查询尽可能命中同一批节点从而提升 fragment cache 等缓存模块的命中率。该版本修复了该策略下缓存命中率被意外削弱的问题使启用一致性哈希调度的集群能够获得预期的缓存收益。2. Cast 语义修正bigint 转 varchar 不再静默截断此版本修复了bigint到varchar的转换行为。此前将一个数值转换为宽度不足的定长varchar时可能不会报错现在当目标varchar的宽度小于容纳结果所需的大小时转换将直接失败。官方给出的 CLI 示例select cast(1234500000000000000 as varchar(3));执行结果将报错Query ... failed: Value 1234500000000000000 cannot be represented as varchar(3)这一变更属于行为收紧类破坏性变更breaking change如果业务 SQL 中存在依赖截断不报错的隐式转换逻辑升级后可能触发查询失败。建议在升级前扫描线上 SQL将此类转换改为显式的varchar(N)长度声明或使用try_cast进行容错处理。3. 修复 Reorder Joins 优化缺陷修复了重排 Join 优化reorder joins optimization的一个缺陷当原始构建侧build side大于配置的join-max-broadcast-table-size时生成的执行计划可能不是最优的。该配置用于控制广播 Joinbroadcast join的构建侧大小上限。本次修复确保了即使原始 build 侧尺寸超过阈值、需要切换到其他 Join 策略如分桶 Join时Join 顺序重排仍能产生合理的执行计划避免因策略切换导致计划质量下降。4. 核心新特性Distinct 聚合大块溢出Large Block Spill这是本版本最值得关注的新功能面向高基数 Distinct 聚合场景下的内存管理问题。当单个数据块block体积过大时将其整体保留在内存中进行 Distinct 去重会占用大量内存。0.271 引入了两个新的配置属性允许将超过阈值的块单独溢出spill到独立的溢出文件中。新增配置属性experimental.distinct-aggregation-large-block-size-threshold作用定义块大小阈值字节超过该阈值的块将被溢出到单独的 spill 文件。可被 Session 属性distinct_aggregation_large_block_size_threshold覆盖。默认值50MB由源码确认见下文。experimental.distinct-aggregation-large-block-spill-enabled作用启用将大于上述阈值的块溢出到独立 spill 文件的行为。可被 Session 属性distinct_aggregation_large_block_spill_enabled覆盖。默认值false默认关闭需要显式开启。源码级解析配置定义与默认值配置类位于 JavaFeaturesConfig.java其中明确了两个属性的定义方式与默认值private boolean distinctAggregationLargeBlockSpillEnabled; private DataSize distinctAggregationLargeBlockSizeThreshold new DataSize(50, MEGABYTE); Config(experimental.distinct-aggregation-large-block-size-threshold) ConfigDescription(Block size threshold beyond which it will be spilled into a separate spill file) public JavaFeaturesConfig setDistinctAggregationLargeBlockSizeThreshold(DataSize distinctAggregationLargeBlockSizeThreshold) { ... } Config(experimental.distinct-aggregation-large-block-spill-enabled) ConfigDescription(Spill large block to a separate spill file) public JavaFeaturesConfig setDistinctAggregationLargeBlockSpillEnabled(boolean distinctAggregationLargeBlockSpillEnabled) { ... }即distinctAggregationLargeBlockSizeThreshold默认值为50 MBdistinctAggregationLargeBlockSpillEnabled默认值为false。该文件还展示了本特性所在的溢出特性族中的其他相关配置便于读者理解上下文配置属性默认值说明experimental.aggregation-spill-enabledtrue聚合运算是否允许溢出experimental.distinct-aggregation-spill-enabledtrueDistinct 聚合是否允许溢出experimental.dedup-based-distinct-aggregation-spill-enabledfalse溢出前是否先对 Distinct 输入去重experimental.distinct-aggregation-large-block-spill-enabledfalse大块是否溢出到独立 spill 文件本版本新增experimental.distinct-aggregation-large-block-size-threshold50MB大块溢出阈值本版本新增Session 属性覆盖机制配置项对应的 Session 属性常量定义在 JavaWorkerSessionPropertyProvider.java 中public static final String DISTINCT_AGGREGATION_LARGE_BLOCK_SPILL_ENABLED distinct_aggregation_large_block_spill_enabled; public static final String DISTINCT_AGGREGATION_LARGE_BLOCK_SIZE_THRESHOLD distinct_aggregation_large_block_size_threshold;这意味着无需修改集群配置即可针对单个查询或会话临时调节行为例如SET SESSION distinct_aggregation_large_block_spill_enabled true; SET SESSION distinct_aggregation_large_block_size_threshold 100MB;运行时的实际溢出判断逻辑在 GenericAccumulatorFactory.java 中聚合算子会在执行期读取这两个参数通过isDistinctAggregationLargeBlockSpillEnabled(session)与getDistinctAggregationLargeBlockSizeThreshold(session)并在构建聚合状态时判断if (isDistinctAggregationLargeBlockSpillEnabled) { if (rowBlock.getSizeInBytes() distinctAggregationLargeBlockSizeThreshold.toBytes()) { // 将大块溢出到单独的 spill 文件 } }可以看出实际生效路径是查询会话 → Session 属性/集群配置 → GenericAccumulatorFactory 运行时判断块大小 → 超过阈值则整块溢出。当单个块包含大量 Distinct 值时将其整体移出内存可以显著降低内存峰值代价是引入额外的磁盘 I/O因此该特性适合内存紧张但磁盘充裕的部署环境。配置解析的单元测试可参考 TestJavaFeaturesConfig.java用于验证属性到配置对象的正确绑定。配置示例config.properties# 启用大块溢出并将阈值调整为 100MB默认 50MB experimental.distinct-aggregation-large-block-spill-enabledtrue experimental.distinct-aggregation-large-block-size-threshold100MB5. Web UI 支持查看展开后的 Prepared Query0.271 在 Web UI 中新增了对**展开后 prepared query预处理查询展开结果**的查看支持。用户通过 Prepared Statement 提交查询时实际执行的是参数替换、宏展开后的完整查询文本此功能便于在排查问题时直接查看最终下发的展开后 SQL而无需手动拼参数。6. 使用 double/real 作为 Map 键时生成警告从本版本开始当查询中创建以double或real浮点类型作为键的map时Presto 会生成一条警告。浮点数在计算机中以近似值存储如0.1实际为二进制近似直接作为 Map 键存在精度与相等性判断上的隐患如NaN、0.0/-0.0等问题因此引擎对该用法给出提示帮助用户在编写 SQL 时尽早发现潜在风险。二、Hive 连接器变更Hive Connector Changes1. 修复分区 Hive 表带复杂列的 ANALYZE TABLE修复了针对包含复杂列array、map、struct的分区 Hive 表执行ANALYZE TABLE时的缺陷。此前对这类表收集统计信息可能失败或产生错误结果本版本修复了该场景确保复杂列类型也能正确完成统计信息采集。2. 提升复杂列表的 ANALYZE TABLE 性能在修复正确性的同时本版本还优化了含复杂列 Hive 表上ANALYZE TABLE的性能。复杂列的统计收集如嵌套结构的 null 比例、唯一值估算等通常比标量列开销更大此优化直接降低了 CBO基于成本的优化器在复杂表上的统计收集成本进而改善后续 Join 顺序选择与表扫描计划的生成质量。实践建议升级到 0.271 后对于此前 ANALYZE 异常的复杂列分区表建议重新执行一次ANALYZE TABLE ...以刷新统计信息从而让优化器获得准确的成本依据。三、Iceberg 连接器变更Iceberg Connector Changes1. 移除 iceberg.catalog.uri 配置本版本移除了iceberg.catalog.uri配置项统一改用hive.metastore.uri。此前 Iceberg 连接器内部存在独立的 catalog URI 配置与 Hive Metastore URI 配置并存且易造成混淆升级后 Iceberg 的元数据访问将统一走hive.metastore.uri。升级注意如果现有 Iceberg catalog 配置中设置了iceberg.catalog.uri升级到 0.271 后该配置不再生效必须将其值迁移到hive.metastore.uri否则连接器可能无法访问元数据。迁移示例catalog 配置文件如etc/catalog/iceberg.properties# 迁移前 # iceberg.catalog.urithrift://metastore-host:9083 # 迁移后 hive.metastore.urithrift://metastore-host:90832. Iceberg 连接器支持 ORC 格式缓存模块Iceberg 连接器新增了对ORC 格式缓存模块的支持使得 Iceberg 表上的 ORC 读取可以接入 Presto 的缓存框架在重复查询热点数据时利用缓存降低底层存储访问开销。这一能力与 Presto 的 fragment cache / 数据缓存体系一致适合冷热数据访问不均、希望降低远程存储延迟的场景。3. Iceberg 连接器支持基本时间戳类型Iceberg 连接器新增了对基本 timestamp时间戳类型的支持使时间戳列可以在 Iceberg 表上正常读写与参与运算。该变更扩大了 Iceberg 连接器的类型覆盖面此前因类型不支持而无法使用的 timestamp 字段在升级后可直接使用。四、版本 Credits本版本由以下贡献者共同完成Abhishek Aggarwal, Amit Dutta, Arjun Gupta, Arunachalam Thirupathi, Beinan, Chunxu Tang, James Petty, James Sun, JySongWithZhangCe, Masha Basmanova, Mayank Garg, Neerad Somanchi, Otakar Trunecek, Pranjal Shankhdhar, Rebecca Schlussel, Rongrong Zhong, Sergii Druzkin, Shashwat Arghode, Swapnil Tailor, Timothy Meehan, Zitong Wei, Abhisek Saikia, Eric Liu, Mengdi Lin, singcha, v-jizhang。五、升级检查清单变更项类型升级动作bigint→varchar cast 语义收紧破坏性检查依赖截断的 SQL改用try_cast或加大长度移除iceberg.catalog.uri破坏性迁移到hive.metastore.uri新增 distinct 大块溢出配置新增功能需要时开启experimental.distinct-aggregation-large-block-spill-enabledWeb UI 展开 prepared query新增功能直接可用map 使用浮点键警告新增告警审视相关 SQL 的键类型Hive ANALYZE 修复与优化修复/优化建议重新 ANALYZE 复杂列表CONSISTENT_HASHING 缓存修复修复无需动作总体而言Presto 0.271 以内存治理精细化 语义正确性收紧 连接器能力补全为主线Distinct 聚合大块溢出为高基数聚合场景提供了新的内存减压手段cast 语义修正与配置移除属于需要提前评估的破坏性变更Hive/Iceberg 连接器的修复与增强则让复杂列统计与 Iceberg 类型支持更加完善。建议读者结合自身集群配置与 SQL 使用情况对照上述检查清单完成升级验证。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
开源协作实践指南:从 Fork 到 Merge 的完整贡献流程与 easy-vibe 项目实战 教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 开源不仅是"免费用别人的代码",更是一种全球化的协作模式和职业加速器。… · 2026/9/23 11:57:16
opencodex 全局上下文上限:Models 页 Context Cap 值可配置化与 Set-all 批量开关实践 opencodex 全局上下文上限:Models 页 Context Cap 值可配置化与 Set-all 批量开关实践 【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App,… · 2026/9/23 11:57:16
有关三国的游戏高频面试题性能优化实战指南 有关三国的游戏高频面试题性能优化实战指南 刚接手那个叫“有关三国的游戏”的项目时,我直接崩了。后台监控显示,每秒钟处理几千个玩家登录请求,服务器CPU却飙到90%以上,响应时间从50毫秒变成了2秒。最让我头疼的是,去翻官方源码仓库里的文档,… · 2026/9/23 11:57:10
20000大写处理卡死?重构这段代码,性能提升90% 20000大写处理卡死?重构这段代码,性能提升90% 上周一个老学员在群里炸了,说项目上线后,财务模块的账单导出功能直接卡死,服务器 CPU 飙到 100%。他查了半天,发现是那个把数字转成“人民币大写”的函数在作怪。 这种 版本升级后… · 2026/9/23 12:40:56
Move Prover 的 CVC4 后端集成指南:求解器切换、测试基线与编码定制 Move Prover 的 CVC4 后端集成指南:求解器切换、测试基线与编码定制 【免费下载链接】diem Diem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world. 项目地址: https://gitcode.com/gh_… · 2026/9/23 12:40:50
Android 10 刷新率切换机制详解:从 Display.Mode 到应用层实践 1. 从 Android 10 开始,刷新率不再是一个“只读属性”如果你在 Android 9 及以前做过显示相关的开发,大概率会有这样一个印象:屏幕刷新率是系统底层和硬件之间的事,应用层能做的事情非常有限。大多数情况下,你只能通过… · 2026/9/23 12:40:43
树莓派人脸识别实战:基于dlib与face_recognition的完整项目 简介:这是一份基于树莓派的人脸识别完整项目包,面向人工智能、通信、自动化、电子信息、物联网等专业的在校学生和开发者,尤其适合毕业设计、课程设计及项目初期演示。资源包含从人脸数据采集、特征提取到实时识别的完整 Python 代码… · 2026/9/23 12:40:43
ASME Y14.5-2009 中文全译本解读:GDT 基准、公差与检具设计实战 简介:ASME Y14.5-2009中文版是机械设计与制造领域尺寸与公差标注的权威标准译本,面向机械工程师、制图人员、质检及工艺技术人员,也适合高校机械专业师生作为工程图样规范参考。该标准为ASME Y14.5M-1994(R2004)的更新版本,系统规… · 2026/9/23 12:40:43
做主播需要什么设备?3类高频面试题拆解 做主播需要什么设备?3类高频面试题拆解 官方文档往往长篇大论,初学者很难在第一时间抓住核心配置逻辑。面对“做主播需要什么设备”这类看似生活化实则考察系统思维与硬件底层原理的高频面试题,许多应届生容易陷入参数堆砌的误区。… · 2026/9/23 12:40:35
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29