一. 前言
在Presto中,select xxx from xxx where xxx in (select xxx from xx) 这种形式的SQL会被转成成Semi Join执行,通过xxx与子查询Join并且保留xxx的值实现in的过滤功能。本文主要介绍Semi Join在Presto中是如何实现的。
二. Semi Join的实现
其实在Presto中,Semi Join的实现原理还是很简单的,本章以select * from t1 where id not in (select * from t2) 为例介绍Semi Join的实现过程。
-
Presto先把select * from t2的子查询编译成SetBuilderOperator算子:
2. 先执行子查询,子查询所有的数据完成输入后,SetBuilderOperator的channelSetFuture会被设置为Done状态,并且将子查询的结果保存在channelSetFuture中:
3. channelSetFuture 完成后,HashSemiJoinOperator便开始接收数据:
4. HashSemiJoinOperator一边接收数据,一般判断Join列的数据是否在channelSet中存在,然后将存在的状态在输出Page中保存成新的一列:
5. HashSemiJoinOperator的输出再传给FilterAndProjectOperator,FilterAndProjectOperator 根据4中新增加的Bool列为true or false将数据过滤或者保留:
如上就是在Presto中Semi Join的实现过程。