首页/新闻资讯/正文详情

Presto Release 0.90 技术解读:规划器改进、新聚合函数与关键配置项

发布时间:2026/9/24 13:17:13 来源:云帆数科 栏目:资讯中心
Presto Release 0.90 技术解读:规划器改进、新聚合函数与关键配置项
大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载本文以 Presto 0.90 版本的官方发布说明为主体逐项解读该版本在查询规划、函数与语言特性、Hive 连接器以及 SPI 层面的变更并结合当前仓库源码说明task.writer-count、compiler.interpreter-enabled、hive.assume-canonical-partition-keys等配置项的作用与背景。读完本文你将掌握 0.90 版本引入的核心能力、每项变更背后的设计意图以及升级到该版本时需要注意的兼容性事项。版本警告Presto 0.90 存在内存泄漏问题官方明确提示该版本不应被使用This release has a memory leak and should not be used。本文仅作为技术演进记录与源码解读实际生产部署请选择修复该问题之后的版本。一、General Changes规划器与执行引擎的整体改进0.90 版本在查询规划、任务执行与错误处理上有多项改进以下是官方发布说明中列出的全部变更及其源码侧印证。1. 分区与放置感知Partition and Placement AwarenessInitial support for partition and placement awareness in the query planner. This can result in better plans for queries involvingJOINandGROUP BYover the same key columns.查询规划器开始初步支持分区感知与放置感知。当查询在相同 key 列上同时执行JOIN和GROUP BY时规划器可以据此生成更优的执行计划——例如让数据在本地完成部分聚合减少跨节点 shuffle 的数据量。该特性是后续 Presto 分布式执行优化如 grouped execution、分区感知调度的早期雏形。2. UNION 查询规划改进Improve planning of UNION queries.UNION 查询的规划质量得到提升。这一方向与后续版本对 UNION 的分布式执行优化一脉相承。3. 查询事件中携带 Presto 版本号Add presto version to query creation and completion events.查询创建事件query creation events与查询完成事件query completion events现在会携带 Presto 版本号方便运维侧按版本审计、排查问题。4. 新增配置项 task.writer-count每个任务的写入线程数Add propertytask.writer-countto configure the number of writers per task.该配置项用于设置每个 task 的 writer写入器数量直接影响写入密集型查询如INSERT、CREATE TABLE AS的并行度。从当前仓库源码看该配置的解析入口位于 TaskManagerConfig.javaConfig(task.writer-count) public TaskManagerConfig setWriterCount(int writerCount) { this.writerCount writerCount; return this; }其默认值为1见同文件中private int writerCount 1;即默认每个 task 只有一个 writer。配置方式是在 coordinator 与 worker 的config.properties中加入task.writer-count4与之配套的还有task.partitioned-writer-count位于同一文件中带ConfigDescription注解说明Number of writer threads per task for partitioned writes. If not set, the number set by task.writer-count will be used用于为分区写入单独设置 writer 数未设置时回退到task.writer-count的值。该配置项同样暴露为会话级属性可在 SystemSessionProperties.java 中看到其对应实现。5. 若干 Bug 修复二进制类型常量表达式优化修复了优化涉及 binary 类型的常量表达式时的 bug。表写入器部分提交问题修复了清理失败查询时表写入器可能提交部分结果的问题避免失败查询留下半成品数据。包含 NaN/Infinity 的 double 数组 unnest修复了对包含 NaN 或 Infinity 的 double 数组执行UNNEST时的 bug。空数组元素访问修复了访问空数组中元素时的失败问题。Remote page is too large 错误修复了该远程页过大的报错。CAST 到 UNKNOWN 的错误信息改进了将值 cast 为UNKNOWN类型时的错误提示。approx_distinct 文档修正更新了approx_distinct的文档给出正确的标准误差界。6. 默认关闭解释器回退新增 compiler.interpreter-enabledDisable falling back to the interpreter when expressions fail to be compiled to bytecode. To enable this option, addcompiler.interpreter-enabledtrueto the coordinator and worker config properties. Enabling this option will allow certain queries to run slowly rather than failing.Presto 会将表达式编译为字节码bytecode以提升执行效率。此前若表达式编译失败Presto 会自动回退到解释器interpreter执行0.90 起这一回退行为被默认关闭——编译失败时查询将直接失败而不是静默降级为慢速解释执行。如果希望保留慢速执行而非失败的行为需在 coordinator 和 worker 的config.properties中显式开启compiler.interpreter-enabledtrue从当前仓库源码看该配置已被标记为废弃配置DefunctConfig(compiler.interpreter-enabled)见 CompilerConfig.java说明后续版本已彻底移除该回退路径表达式编译失败一律按错误处理。这是 Presto 执行引擎向编译优先、严格失败演进过程中的重要一步。7. Java 客户端 JDBC 语义收敛Improve Java client conformance. In particular, all unimplemented methods now throwSQLExceptionrather thanUnsupportedOperationException.Java 客户端JDBC 驱动的规范符合性得到改进所有未实现的方法现在统一抛出SQLException而不是UnsupportedOperationException这符合 JDBC 规范对驱动行为的要求方便应用层按标准方式捕获驱动异常。相关文档见 presto-docs/src/main/sphinx/clients/java.rst。二、Functions and Language Features新函数与 SQL 语言增强1. 新增聚合函数bool_and、bool_or、every 与 map_aggAddbool_andandbool_oraggregation functions. Add standard SQL functioneveryas an alias forbool_and. Addmap_aggaggregation function.0.90 新增了四个聚合函数函数语义说明bool_and(boolean)对一组布尔值求逻辑与只要存在一个false即返回falsebool_or(boolean)对一组布尔值求逻辑或只要存在一个true即返回trueevery(boolean)标准 SQL 别名等价于bool_and提供标准 SQL 兼容写法map_agg(key, value)将两列聚合成一个 MAPkey 为 MAP 的键value 为对应的值从当前仓库源码看bool_and与bool_or的实现分别位于 BooleanAndAggregation.java 与 BooleanOrAggregation.javamap_agg的实现位于 MapAggregationFunction.java它们与map_union等函数共同组成 Presto 的 Map 类聚合函数家族。典型用法示例-- 检查某组订单是否全部已支付 SELECT order_id, bool_and(paid) AS all_paid FROM orders GROUP BY order_id; -- 使用标准 SQL 的 every 别名 SELECT order_id, every(paid) AS all_paid FROM orders GROUP BY order_id; -- 将键值两列聚合成 map SELECT user_id, map_agg(attr_key, attr_value) AS attrs FROM user_attributes GROUP BY user_id;2. 新增标量函数year_of_week 与 regexp_extract_allAddyear_of_weekfunction. Addregexp_extract_allfunction.year_of_week(date)返回给定日期所在周所属的年份ISO 周历中的年份。与week()配合使用可正确处理跨年周例如 2020 年最后几天落在 2021 年第 1 周的情况。regexp_extract_all(string, pattern)返回输入字符串中所有匹配正则表达式的子串结果为数组。与仅返回第一个匹配的regexp_extract形成互补。-- 提取字符串中所有数字 SELECT regexp_extract_all(abc123def456, [0-9]); -- [123, 456] -- 获取 ISO 周年份 SELECT year_of_week(DATE 2021-01-01); -- 2020该日期属于 2020 年的第 53 周3. JSON 到 ARRAY/MAP 的 CAST 支持Add support for castingJSONtoARRAYorMAPtypes.此前 JSON 只能转换为标量或ROW结构0.90 起支持将JSON直接 cast 为ARRAY或MAP类型SELECT CAST(JSON [a, b] AS ARRAY(VARCHAR)); -- [a, b] SELECT CAST(JSON {k: 1} AS MAP(VARCHAR, INTEGER)); -- {k1}4. VALUES 子句支持无括号表达式Add support for unparenthesized expressions inVALUESclause.VALUES子句现在可以直接使用无括号包裹的表达式列表SQL 写法更加灵活。5. 新增 SET SESSION / RESET SESSION / SHOW SESSION 语句AddedSET SESSION,RESET SESSIONandSHOW SESSION.0.90 正式引入了会话管理三件套SET SESSION设置会话级属性例如SET SESSION task_writer_count 4;RESET SESSION将会话属性重置为默认值例如RESET SESSION task_writer_count;SHOW SESSION列出当前所有会话属性及其默认值会话属性与配置文件中的属性一一对应如task.writer-count对应会话属性task_writer_count这为用户在不重启集群的情况下按会话调整行为提供了便利。6. EXPLAIN (TYPE DISTRIBUTED) 输出增强Improve formatting ofEXPLAIN (TYPE DISTRIBUTED)output and include additional information such as output layout, task placement policy and partitioning functions.分布式执行计划的格式化输出得到改进新增了**输出布局output layout、任务放置策略task placement policy和分区函数partitioning functions**等信息便于开发者理解数据在集群中的分布方式与 shuffle 策略。EXPLAIN (TYPE DISTRIBUTED) SELECT regionkey, count(*) FROM nation GROUP BY regionkey;三、Hive ChangesHive 连接器的重要修复1. 默认关闭非字符串分区键的优化获取新增 hive.assume-canonical-partition-keysDisable optimized metastore partition fetching for non-string partition keys. This fixes an issue were Presto might silently ignore data with non-canonical partition values. To enable this option, addhive.assume-canonical-partition-keystrueto the coordinator and worker config properties.这是一个重要的数据正确性修复。此前 Presto 对非字符串分区键如INT、DATE使用优化的 metastore 分区批量获取路径但该路径要求分区值必须是规范形式canonical——例如DATE 2021-01-01应存储为2021-01-01而非2021-1-1。若 Hive 表中存在非规范形式的分区值Presto 可能会静默忽略这些分区对应的数据造成查询结果不完整。0.90 的修复方式是默认禁用针对非字符串分区键的优化获取路径。如果确认你的 Hive 表中所有分区值都是规范形式、且希望恢复优化路径的性能可在 coordinator 和 worker 的config.properties中显式开启hive.assume-canonical-partition-keystrue从当前仓库源码看该配置项的解析位于 HiveClientConfig.javaConfig(hive.assume-canonical-partition-keys) public HiveClientConfig setAssumeCanonicalPartitionKeys(boolean assumeCanonicalPartitionKeys) { this.assumeCanonicalPartitionKeys assumeCanonicalPartitionKeys; return this; }字段默认值为falseprivate boolean assumeCanonicalPartitionKeys;与发布说明中默认关闭、需显式开启的表述一致。相关使用逻辑散见于 Hive 连接器的分区元数据与 split 生成代码中如 HiveMetadata.java、HiveSplitSource.java并在 TestHiveClientConfig.java 等测试中有覆盖。2. S3 权限错误不再重试Dont retry operations against S3 that fail due to lack of permissions.针对 S3 的访问请求若失败原因是权限不足如 AccessDeniedPresto 将不再重试避免无意义的重复请求拖慢整体失败速度。四、SPI Changes连接器 SPI 的破坏性变更AddgetColumnTypestoRecordSink. UseSlicefor table writer fragments. AddConnectorPageSinkwhich is a more efficient interface for column-oriented sources.SPI 层有三项变更RecordSink新增getColumnTypes方法写入器可以获知列类型信息。表写入器片段改用Slicewriter fragment 的数据载体统一为SlicePresto 的二进制缓冲抽象。新增ConnectorPageSink接口面向列式数据源提供更高效的写入口替代原先逐行写入的模式。重要兼容性提示官方原文This is a backwards incompatible change with the previous connector SPI. If you have written a connector, you will need to update your code before deploying this release.即这是一次向后不兼容的 SPI 变更。任何基于旧版 SPI 自研连接器的用户在升级到 0.90 之前必须同步更新连接器代码实现getColumnTypes、改用Slice承载 writer fragment、或将写入逻辑迁移到ConnectorPageSink否则将无法正常工作。五、升级建议与注意事项综合以上内容升级到 Presto 0.90 时请重点关注不要在生产使用 0.90该版本存在已知内存泄漏官方明确不建议使用应升级到包含修复的后续版本。检查自定义连接器SPI 变更向后不兼容自定义连接器必须适配RecordSink.getColumnTypes、Slicewriter fragment 与ConnectorPageSink。复核非字符串分区键的 Hive 表若你的表分区值全部规范可开启hive.assume-canonical-partition-keystrue恢复优化路径否则保持默认关闭以保证数据不丢失。表达式编译失败策略变化编译失败不再回退解释器查询会直接失败需要慢速兜底可临时开启compiler.interpreter-enabledtrue后续版本已彻底废弃该配置。按需调整写入并行度task.writer-count默认1写入密集型负载可通过配置文件或会话属性SET SESSION task_writer_count N调大。善用新函数与语句bool_and/bool_or/every/map_agg、year_of_week/regexp_extract_all、SET/RESET/SHOW SESSION与增强版EXPLAIN (TYPE DISTRIBUTED)均可直接投入使用。相关文档与源码索引版本发布说明原文release-0.90.rsttask.writer-count配置实现TaskManagerConfig.javacompiler.interpreter-enabled废弃标记CompilerConfig.javahive.assume-canonical-partition-keys配置实现HiveClientConfig.java新聚合函数实现BooleanAndAggregation.java、BooleanOrAggregation.java、MapAggregationFunction.java会话管理语句文档set-session.rst、reset-session.rst、show-session.rstJava 客户端文档java.rst赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto Release 0.169 版本详解规划回归修复、聚合性能优化与 JDBC/CLI/Cassandra 改进Presto Release 0.169 版本详解规划回归修复、聚合性能优化与 JDBC/CLI/Cassandra 改进 导读 本文基于 Presto 官大数据数据库后端Presto Release 0.82 技术解读ROW 类型原生支持、current_timezone 函数与查询规划优化Presto Release 0.82 技术解读ROW 类型原生支持、current_timezone 函数与查询规划优化 本文以 release 0.82.大数据数据库后端Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进 本篇文章以当前仓库中 release 0.86.rst https大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

智能家居全屋组网与布线实战指南:从AC+AP到Mesh
智能家居全屋组网与布线实战指南:从AC+AP到Mesh

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:17:00

固件逆向实战:从Hex文件到C语言反编译全流程解析
固件逆向实战:从Hex文件到C语言反编译全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:17:00

ESP32 上跑 WebAssembly:打造单片机应用商店
ESP32 上跑 WebAssembly:打造单片机应用商店

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:17:00

AI微服务底座向导式安装实战:Ollama+Qdrant+Dify+网关一键部署
AI微服务底座向导式安装实战:Ollama+Qdrant+Dify+网关一键部署

我一直觉得,AI 应用开发里最劝退人的环节不是写代码,而是搭环境。你想做一个带知识库问答的智能体,背后要跑模型推理、向量检索、应用编排,再来个 API 网关做统一入口,这一整套微服务底座手动配下来,光依赖… · 2026/9/24 23:07:18

VC如何为AI创业公司挑选云平台:从技术尽调到成本规划
VC如何为AI创业公司挑选云平台:从技术尽调到成本规划

上个月和一个在头部机构做投后的朋友聊项目,他跟我抱怨:Portfolio 里 20 多家 AI 创业公司,今年光是处理算力报销和平台选型就占掉三分之一的工作量。这件事确实被很多人低估了——AI 公司的业务可以千差万别,但底层都长在同一片土… · 2026/9/24 23:07:18

SAP PFCG菜单乱码排查指南:从语言链到文本表修复
SAP PFCG菜单乱码排查指南:从语言链到文本表修复

最近在权限顾问的群里,又看到有人贴了一张PFCG菜单乱码的截图,底下好几个刚入行的朋友跟着问:是不是权限配错了?是不是角色数据坏了?要不要重启服务器?我一看那截图,心里差不多就有数了——这种… · 2026/9/24 23:07:18

LeetCode 102二叉树层序遍历全解:BFS队列模板与高频变体
LeetCode 102二叉树层序遍历全解:BFS队列模板与高频变体

LeetCode 102这道“二叉树层序遍历”,在LeetCode上标记为中等难度,却几乎是每一场算法面试的“必考热身题”。如果你刷过LeetCode热门100题,大概率已经见过它;如果你还没开始刷二叉树,这道题作为切入点也再合适不过。层… · 2026/9/24 23:07:18

二叉树层序遍历与BFS:队列原理到LeetCode变体题实战
二叉树层序遍历与BFS:队列原理到LeetCode变体题实战

LeetCode 102 二叉树层序遍历,几乎是每个刷题人绕不开的入门题。题目本身看着很短:给你一棵二叉树,从左到右、从上到下,把每一层的节点值输出到一个二维数组里。但就是这道题,每年都能卡住不少刚开始刷算法的人。你可能… · 2026/9/24 23:07:18

Agent安全实战:从越权到暴走,构建L1-L5分级防护体系
Agent安全实战:从越权到暴走,构建L1-L5分级防护体系

1. 从两起真实越权事件说起:Agent 安全为什么突然成了焦点过去大半年,智能体(Agent)从"能聊两句的玩具"迅速变成了"能自己调工具、自己写文件、自己发请求"的执行体。能力上来了,事故也跟着来了。… · 2026/9/24 23:07:12

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码