一、Hash Join
场景:对于输入的两张小表进行单机的join运算。
原理:两张表中相对小的一张表作为Hash表加载到内存中,另外一张表作为探测表,循环去Hash表中探测匹配。
二、Broadcast Hash Join
Hash Join在分布式场景下的一种实现。
场景:对于输入的两张表,一张大表,一张小表(小于10M)
原理:将小表广播分发到另一张大表所在的分区节点上,分别并发地与其上的分区记录进行hash join。
三、Shuffle Hash Join
Hash Join在分布式场景下的一种实现。
场景:对于输入的两张表,一张大表,一张小表(大于10M)
原理:根据join key将两张表分别按照join key进行重新组织分区,这样将join分而治之,划分为很多小join,充分利用集群资源并行化。
四、Sort Merge Join
场景:对于输入的两张大表,进行join运算。
原理:
1、shuffle阶段:将两张大表根据join key进行重新分区,两张表数据会分布到整个集群,以便分布式并行处理。
2、sort阶段:对单个分区节点的两表数据,分别进行排序。
3、merge阶段:对排号序的两张分区表数据执行join操作。join操作很简单,分别遍历两个有序序列,碰到相同join key就merge输出,否则去更小的一边。
注:Sort Merge Join于spark的shuffle实现算法想匹配,因此在应该shuffle之后partition数据都是按key排序的。因此理论上可以认为经过shuffle之后是不需要sort的,可以直接merge。