Spark的几种join方式对比

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容