Join是SQL语句中的常用操作,良好的表结构能够将数据分散在不同的表中,使其符合某种范式,减少表冗余、更新容错等。而建立表和表之间关系的最佳方式就是Join操作。

对于Spark来说有3中Join的实现,每种Join对应着不同的应用场景:

  1. Broadcast Hash Join :适合一张较小的表和一张大表进行join
  2. Shuffle Hash Join : 适合一张小表和一张大表进行join,或者是两张小表之间的join
  3. Sort Merge Join :适合两张较大的表之间进行join

Hash Join

先来看看这样一条SQL语句:

select * from order,item where item.id = order.i_id

基本流程可以参考上图,这里有两个小问题需要关注:

而在分布式环境下,表会被分割为多份分配到不同机器上执行,这就要求对 Hash join 方案进行改造。

hash join分布式改造一般有两种经典方案:

  1. broadcast hash join:将其中一张小表广播分发到另一张大表所在的分区节点上,分别并发地与其上的分区记录进行hash join。broadcast适用于小表很小,可以直接广播的场景