Presto之Hash Join 数据碰撞的实现过程

本文深入探讨了Presto如何在HashJoin中处理数据碰撞并生成Join结果。在Build侧,数据通过HashBuilderOperator进行处理,生成positionToHashes和key数组。在Probe侧,计算Joinkey的哈希值来查找匹配的Build表行。最终,通过将Probe表和buildPageBuilder组合产生碰撞后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 前言

        本文主要叙述在Presto中,Hash Join是怎么做相同key值的碰撞和最后Join结果的生成的实现原理的。其实在Presto中数据碰撞在文章从构建到使用,openLooKeng 如何实现 Hash Join ?_openLooKeng的博客-优快云博客 已经描述的非常清楚了。本文主要是基于此文章的基础上,补充一些关键步骤的代码段便于理解。

二. Presto两表Join数据碰撞的实现

      2.1 Build侧表的处理过程

            Build侧表的处理过程是在HashBuilderOperator算子中处理的,数据流的处理主要过程如下所述:

          1) 数据输入:HashBuilderOperator::addInput

          addInput的Page已经包含了Hash通道的Hash值的数据了,例如:

      假如Build表中只有一个列,上边的Input中的Page会有2个列,一列为Build表的数据,一列为Join列的Hash值。

        2): 每行地址编码 PagesIndex::addPage

         3): 重复1)和2),直至完成输入

         4): 完成输入后生成positionToHashes:positionToHashes是个byte数组,下标为第几行,value为join列的Hash值的最后一个byte。

 

          5):生成key数组,key数组下标是join列值的Hash值再Hash后的值,value为第几行

 

     2.2 Probe表数据探测的过程

      1):输入数据,对Probe表的每一行数据进行探测:

      2):计算Probe表Join key的Hash值的Hash值,通过上述5) 中的key数组,还原找到Hash表的位置

    3):拿到position后,通过上述2)的逆操作后,还原在Build表中与Probe表相同key值的行号:

     4):将行号添加到buildPageBuilder中,buildPageBuilder为build表与Probe表相同key值的按顺序输出的Page。

 

三. Presto两表碰撞后结果的生成。

        有了上述的Probe表和buildPageBuilder表之后,结果的输出其实就是将Probe表的Block和buildPageBuilder的block 按照顺序组装在一起即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值