一. 前言
本文主要叙述在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 按照顺序组装在一起即可。