Spark有BroadCastJoin、ShuffleHashJoin、SortMergeJoin三种join方式。首先讲一下hash join的过程。
hash join过程,hash join作为单机算法。1)确定build table和probe table。build table用join key构建hash table,probe table使用join key进行探测,探测成功就可以join在一起。小表作为build table,大表作为probe table。2)构建hash table,依次读取build table的数据,数据缓存咋及内存中,如果内存放不下,则需要dump到磁盘。3)探测,依次扫描probe table中的数据,使用相同的hash函数映射hash table中的记录,映射成功之后再检查join条件,如果成功就可以将两者join在一起。
1、BroadCastHashJoin,将其中一张小表广播分发到另一张大表所在的分区节点上,分别并发地与其上的分区记录进行hash join。broadcast适用于表很小,可以直接广播的场景。
2、ShuffleHashJoin 一旦小表数据量较大,此时不再适合广播分发。这种情况下,可以根据join key相同必然分区相同的原理,将两张表按join key重新组织分区,这样就可以将join分而治之,划分为很多小join充分利用集群资源并行化。
3、SortMergeJoin 将两张大表按照join key进行重新分区,对单个分区节点的两张表分别进行排序,对排好序的两张表分区数据进行join操作。分别便利两个有序序列,遇到相同join就merge输出,否则取更小一边。
join代价排序 broadcast hash join < shuffle ahsh join < sortmerge hash join
三种join的hints实际写法
A.broadcast hash join 的写法 (若左右表都满足小表阈值,则hint不生效,即默认broadcast右表,mapjoin左表)
select /** MAPJOIN(t2)*/ from t1 join t2 on t1.id = t2.id
select /** BROADCASTJOIN (t2)*/ from t1 join t2 on t1.id = t2.id
select /** BROADCAST(t2)*/ from t1 join t2 on t1.id = t2.id
B. sort merge hash join的写法
select /** MERGE(t1)*/ from t1 join t2 on t1.id = t2.id
select /** SHUFFLE_MERGE(t1)*/ from t1 join t2 on t1.id = t2.id
select /**MergeJOIN(t1) */ from t1 join t2 on t1.id = t2.id
C.shuffle hash join的写法
SELECT /** shuflle_hash(t1)*/ from t1 join t2 on t1.id = t2.id