参考博客:https://www.cnblogs.com/duodushuduokanbao/p/9911256.html
Spark的join实现方案有三种:
- broadcast hash join
- shuffle hash join
- sort-merge join
hash join
确定 小表(Bulid Table) 和 大表(Probe Table),利用小表 根据 key 进行hash,建立hash table,大表同样对key进行相同的hash,映射hash table中的记录,如果映射成功且join条件符合,则将数据进行关联。
为什么 bulid table 选择小表, probe table 选择大表? 因为在构建 hash table 时最好能将其全部加载到内存,这样才效率最高,这也说明了为什么 hash join 算法只适合至少有一个小表的场景,对于两个大表的join 场景并不适用,两个大表的 join ,可选用 sort merge join。
hash join主要针对单机,以下两种是对hash join的分布式改造后
Broadcast join
一般用于维表和实时表进行join,可将维表(一般不超过10M)发送至各个节点,使各个节点都存有一份完整的维表数据,接下来相当于单机进行hash join。
SparkSQL 也可以根据内存资源、带宽资源适量将参数 spark.sql.autoBroadcastJoinThreshold(默认是 10M) 调大,让更多 join 实际执行为 broadcast hash join。
shuffle join
当join的两张表数据量都很大时,利用 key相同的数据将会被分到相同分区上 的原理,将两张表按key进行分区,使相同key的记录分到同一个节点上,然后在对每个节点上的数据进行hash join
sort-merge join(没太理解)
和shuffle join一样,将两张大表join key进行重分区,对每个分区的节点进行排序,然后对排好序的表进行join,join的操作:分表遍历两个有序序列,碰到相同的key就merge然后输出