Presto Release 0.81 技术解读ORC 谓词下推、RCFile 列选择与窗口函数 offset 边界语义修复【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto本篇文章围绕 Presto 发布说明 release-0.81.rst 中记录的三个修复条目展开Hive 连接器侧的 ORC 谓词下推修复、RCFile 列选择修复以及通用侧的lead/lag/nth_value窗口函数对 null 与越界 offset 的处理修复。通过对照当前仓库中的源码与测试读者可以理解这些修复背后的执行机制、边界语义约定以及它们对生产查询性能与正确性的实际影响。版本概览Release 0.81 的发布说明原文Release 0.81 的发布说明共记录了三处变更分为 Hive 与通用两部分Hive ChangesHive 连接器变更修复 ORC 谓词下推Fix ORC predicate pushdown。修复 RCFile 中的列选择Fix column selection in RCFile。General Changes通用变更修复lead、lag和nth_value函数对 null 与越界out-of-rangeoffset 的处理。虽然条目极为精简但每一条都对应着分布式 SQL 引擎中真实且关键的执行路径谓词下推直接关系到扫描阶段的 I/O 与 CPU 开销列选择关系到行存格式的解析正确性窗口函数的 offset 边界则关系到分析型查询结果的正确性。下文分别结合当前仓库源码深入剖析。Hive 变更之一ORC 谓词下推修复谓词下推在 ORC 读取链路中的位置ORCOptimized Row Columnar是一种列式存储格式。谓词下推predicate pushdown指查询引擎将WHERE条件尽可能下推到存储层在读取数据时提前跳过不满足条件的行、Stripe 甚至整个文件从而减少磁盘读取与反序列化开销。在 Presto 中这一能力由 Hive 连接器与presto-orc模块协同实现。在 Hive 连接器侧谓词以TupleDomain的形式被传递到 ORC 读取工厂。当前仓库中的 OrcSelectivePageSourceFactory.java 接收TupleDomainSubfield domainPredicate参数并通过toOrcPredicate(...)将其转换为 ORC 读取器能够理解的谓词对象OrcBatchPageSourceFactory.java 则面向批量读取模式提供相同的桥接能力。谓词最终被用于 Stripes 级、行组级以及行级三个粒度的过滤。核心实现TupleDomainOrcPredicate 的匹配逻辑谓词下推的核心判定逻辑位于 TupleDomainOrcPredicate.java。其matches(long numberOfRows, MapInteger, ColumnStatistics statisticsByColumnIndex)方法基于 ORC 文件的元数据ColumnStatistics进行粗粒度过滤首先通过effectivePredicate.getDomains()取出各列的取值域Domain然后对每一列调用getDomain(type, numberOfRows, columnStatistics)见 getDomain 方法把 ORC 统计信息min/max、null 计数、布隆过滤器等换算成该列可能的取值域最后比较谓词要求的域与统计信息推断的域是否相交若不相交则可直接跳过该 Stripe 或文件。在此基础上StripeReader.java 与 AbstractOrcRecordReader.java 负责在读取 Stripe 时应用这些谓词而presto-orc中一系列SelectiveStreamReader如 LongSelectiveStreamReader.java、SliceDirectSelectiveStreamReader.java 等则在列解码阶段执行行级过滤。本次修复的意义发布说明中的修复 ORC 谓词下推意味着该版本修正了此链路中某一处正确性或效率问题。从当前仓库的架构可以推断谓词下推涉及多层协作——连接器层面的域转换、ORC 读取器层面的统计匹配、以及选择性读取器层面的行级过滤——任何一层对空值、类型或统计信息的处理有误都会导致结果错误或过滤失效。因此这类修复通常同时影响查询正确性与扫描性能是列式存储引擎中收益最直接的优化点。Hive 变更之二RCFile 列选择修复RCFile 与列选择RCFileRecord Columnar File是 Hive 生态中经典的混合存储格式行组内按列存储兼顾行存的快速全行读取与列存的压缩优势。与 ORC/Parquet 这类纯列存格式不同RCFile 读取时必须解析行组内每个列的字节区间再按需组装目标列。所谓列选择column selection / column pruning就是只读取查询涉及的列、跳过无关列的过程。Release 0.81 修复的正是 RCFile 读取中的列选择问题——如果列与列之间的字节区间定位错误或投影列与物理列的下标映射错位就会读出错误的数据。当前仓库中的实现证据当前仓库中 RCFile 的读取实现分布在两个模块presto-rcfile 模块底层 RCFile 格式解析列解码器、行组读取、压缩支持等。Hive 连接器侧适配层RcFilePageSourceFactory.java、RcFilePageSource.java 与 HdfsRcFileDataSource.java。其中RcFilePageSource负责把行组内的列数据组装为 Presto 的Page而列选择正确与否直接决定Page中每个 Channel 对应的列是否与查询计划一致。在写入侧RcFileFileWriterFactory.java 与 RcFileFileWriter.java 提供了 RCFile 的写出能力读写两侧共同维护物理列 ↔ 逻辑列的映射约定。本次修复的意义列选择错误属于典型的静默错误查询不会失败但返回的列值错位。在行组式存储格式中投影列的下标映射、嵌套结构展开以及类型转换都容易引入此类缺陷。该修复保证了SELECT投影列较少时能正确跳过未使用列既保障正确性也让 RCFile 场景下的投影裁剪真正生效。通用变更lead、lag、nth_value 的 null 与越界 offset 修复窗口函数中的 offset 语义lead、lag、nth_value是 SQL 标准窗口函数用于在分区PARTITION内按偏移量访问相邻行或指定序位的值lead(value, offset[, default])取当前行之后第offset行的值lag(value, offset[, default])取当前行之前第offset行的值nth_value(value, n)取窗口帧内第n行的值从 1 开始计数。这些函数的关键边界问题是当 offset 为 null、为负数、超出分区范围或大到超过int范围时引擎应如何表现。Release 0.81 统一修复了这三类函数的 null 与越界 offset 处理。当前仓库中这三个函数分别由 LeadFunction.java、LagFunction.java 与 NthValueFunction.java 实现可以看作该修复语义的现代演进形态。lead / lagnull offset、负 offset 与越界行为以 LeadFunction.java 的processRow为例其边界处理逻辑为offset 为 null当 offset 通道存在且当前行的 offset 值为 null 时直接输出 nulloutput.appendNull()offset 为负通过checkCondition(offset 0, INVALID_FUNCTION_ARGUMENT, Offset must be at least 0)抛出INVALID_FUNCTION_ARGUMENT错误对应 SQL 错误码StandardErrorCode.INVALID_FUNCTION_ARGUMENT而不是静默返回错误结果offset 缺省未显式提供 offset 时默认取 1即下一行超出分区范围目标位置valuePosition超出分区时若提供了default参数则返回默认值否则返回 nullIGNORE NULLS 模式跳过空值累计偏移量见ignoreNulls分支。LagFunction.java 的处理逻辑与之对称向前查找目标行withinPartition限定valuePosition 0 valuePosition currentPosition同样对 null offset 输出 null、对负 offset 抛错、越界时回退到默认值或 null。nth_value基于窗口帧的定位与下限检查NthValueFunction.java 的语义与lead/lag不同——它不是相对当前行偏移而是在整个窗口帧frame内取第 n 个值定位公式为frameStart (offset - 1)offset 从 1 起算。其边界处理包括offset 为 null输出 nulloffset 小于 1抛出Offset must be at least 1INVALID_FUNCTION_ARGUMENT目标位置越界valuePosition不在[frameStart, frameEnd]区间内时输出 nullIGNORE NULLS / RESPECT NULLS分别支持跳过空值或把空值计入序位。从源码结构看offset 先以long读取再经toIntExact转为int因此超大 offset超过int范围会自然落入越界分支返回 null而不会触发整数溢出错误——这正是out-of-range offsets修复所要保证的健壮性。测试用例对修复语义的验证当前仓库的测试充分覆盖了上述边界场景。以 TestNthValueFunction.java 为例其测试方法包括testNthValueUnbounded覆盖常量 offset、变量 offsetnth_value(orderkey, orderkey)、null offsetnth_value(orderkey, null)以及超大 offsetBIGINT 8 * 1000 * 1000 * 1000即 80 亿远超int范围四类场景验证 null 与越界 offset 均安全返回 nulltestNthValueBounded在ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING等有界窗口帧下验证 offset 定位覆盖 Timestamp 等类型testNthValueUnboundedIgnoreNulls/testNthValueUnboundedRespectNulls及对应的 Bounded 版本验证IGNORE NULLS与RESPECT NULLS修饰符下序位计算的差异。lead与lag的对应测试位于 TestLeadFunction.java 与 TestLagFunction.java与nth_value的测试共同构成了窗口函数 offset 边界语义的回归保护网。此外TestWindowQueries.java 从端到端查询层面验证窗口函数在真实执行计划中的行为。修复带来的行为约定总结综合发布说明与当前实现Release 0.81 为这三类窗口函数确立的边界约定可以归纳为下表场景lead / lagnth_valueoffset 为 null返回 null返回 nulloffset 为负抛出INVALID_FUNCTION_ARGUMENTOffset must be at least 0抛出INVALID_FUNCTION_ARGUMENTOffset must be at least 1目标行超出分区/帧返回 default若提供否则 null返回 nulloffset 超过 int 范围落入越界分支安全返回落入越界分支安全返回IGNORE NULLS跳过空值累计偏移跳过空值累计序位这套约定对分析型 SQL 的编写者有直接指导意义依赖窗口函数做环比/同比计算时分区首尾行的越界结果会稳定地回退为默认值或 null而传入非法 offset 会得到明确的错误提示而非静默的错误数据。总结Release 0.81 的三条变更分别落在存储扫描优化ORC 谓词下推、行组格式读取正确性RCFile 列选择与窗口函数边界语义lead/lag/nth_value 的 null 与越界 offset三个层面前两者降低 I/O 与 CPU 开销并保证投影正确后者统一了分析函数在边界输入下的行为约定。通过对照 release-0.81.rst 与当前仓库的源码实现TupleDomainOrcPredicate.java、RcFilePageSource.java、LeadFunction.java 等以及对应的单元测试可以清晰还原这些早期修复在现代代码库中的完整形态——它们至今仍是 Hive 扫描链路与窗口函数执行器的核心行为准则。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
不要让“科技、低碳、绿色、环保”的发展理念成为一句空话! 由于汽车后服务市场的巨大容量及良好的市场发展前景,近年来智能自动化洗车和规模化智能自助洗车如雨后春笋蓬勃发展。各类品牌平台林立大有野蛮生长之势;目前国内各洗车机品牌攻城略池在全国范围迅速展开圈占势力范围!几乎所有品牌的自动化智… · 2026/9/23 13:31:22
Akka Streams 操作符全景指南:从内置 Source/Sink 到 Graph DSL 的完整索引解析 Akka Streams 操作符全景指南:从内置 Source/Sink 到 Graph DSL 的完整索引解析 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.co… · 2026/9/23 13:31:22
3个坑搞定哔哩哔哩动画性能优化 3个坑搞定哔哩哔哩动画性能优化 看了一堆教程还是不会写项目?别急,这病我治过。很多开发者对着哔哩哔哩动画(B站)的源码发呆,觉得架构太复杂,其实核心就卡在【性能优化】上。你不懂它怎么在弱网下丝滑播放,就永远写不出高并发的后台。今天咱们不聊虚… · 2026/9/23 13:31:15
9款AI写论文哪个好?一个“不务正业”的测评:我让它们帮我跑了一组数据 官网:www.shujiangce.com | 微信 公众号 :书匠策AI
先说一个你可能没意识到的真相。
大多数AI写论文工具,本质上是“文字生成器”。你输入一个题目,它输出一段话。至于这段话里的数据从哪来、图表怎么画、参考文献是不是真的… · 2026/9/23 18:59:45
YOLO训练数据集三格式齐备:VOC/COCO/YOLO互转与可复现训练链路 简介:本资源是面向计算机视觉初学者与YOLO目标检测实践者的高质量泄露目标数据集配套包,解决真实场景下小目标检测模型训练缺乏标注规范、格式兼容与工程化支持的痛点。资源包含5000张真实场景高清图片及完整标注,涵盖VOC(1986个X… · 2026/9/23 18:59:38
代码能跑=论文稳过?软件工程毕设AI隐形BUG,盲审一查一个准[特殊字符] 2026软件工程、计算机软件开发、物联网软件方向毕设盲审迎来最严核查年。和大家固有认知不同:软工毕设从来不是「代码能运行就及格」,导师和盲审专家重点看的是需求分析、架构设计、数据库逻辑、功能模块闭环、技术栈适配、测试用例完整性。
很多软工同… · 2026/9/23 18:59:38
部署中国云计算平台避坑指南:3个致命错误让代码跑不通 部署中国云计算平台避坑指南:3个致命错误让代码跑不通 代码从网上复制下来,本地环境明明装好了,一运行却报错 ModuleNotFoundError 或者 ConnectionRefused… · 2026/9/23 18:59:32
舌头分割数据集实战:从2类标签到U-Net基线,避开医学图像分割的5个坑 简介:本资源面向计算机视觉学习者与图像分割开发者,提供一套完整的舌头分割数据集,适用于语义分割模型训练、医学图像预处理及算法验证等场景。数据图像分辨率统一为640640,原图为jpg格式,mask标签为png格式࿰… · 2026/9/23 18:59:31
3个狠招让btc区块链浏览器性能优化提速10倍 3个狠招让btc区块链浏览器性能优化提速10倍 官方文档翻了三遍还是头大?别慌,我懂这种痛苦。BTC区块链浏览器看着简单,实则是个吞内存的怪兽。很多人卡在 性能优化 上,代码跑起来卡得像PPT。… · 2026/9/23 18:59:25
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29