一. 前言
Loopup Join顾名思义就是通过查找方式实现的Join,也即右边常驻内存,左表不断去内存里边loopup 看join条件是否相等来实现join操作。在presto中,常驻内存的表称为HashBuilder表,有HashBuilderOperator算子负责构造,不断去探测的表称为probe表,在LookupJoinOperator中实现probe表对HashBuilder表的探测和数据关联。
二. HashBuilder表的构造
构造表的时候,通过HashBuilderOperator将需要常驻内存的表读到内存中:
HashBuilderOperator::addInput
updateIndex
index.addPage
channels[i].add(block); // 所有数据都在channels中
读完表后:
HashBuilderOperator::finish
finishInput
buildLookupSource
index.createLookupSourceSupplier
return lookupSourceFactory.createLookupSourceSupplier(...valueAddresses, channels...) //将HashBuilder表的数据全部都放在LookupSource,LookupSource为LookupJoinOperator提供右表的数据的读取
state = State.LOOKUP_SOURCE_BUILT //HashBuilder表已经完成构造,LookupJoinOperator将开始工作
三. LookupJoinOperator的探测
LookupJoinOperator的构造函数中的LookupSourceFactory可以得到HashBuilder表的所有数据
probe表的数据通过LookupJoinOperator::addInput 不断进来, 并加工成一个probe表
当下游通过getOutput取一批数据的时候:
LookupJoinOperator::getOutput
processProbe
processProbe(lookupSourceLease.getLookupSource()) //这里用到了HashBuilder表的数据了
joinCurrentPosition
pageBuilder.appendRow(probe, lookupSource, joinPosition) //2表相同数据的碰撞
outputPage = pageBuilder.build(probe)
Block[] blocks = new Block[probeOutputChannels.length + buildOutputChannelCount]; //实现了2表join