数据分析中将两个数据集进行 Join 操作是很常见的场景。在 Spark 的物理计划阶段,Spark 的 Join Selection 类会根 据 Join hints 策略、Join 表的大小、 Join 是等值 Join 还是不等值以及参与 Join 的 key 是否可以排序等条件来选择最 终的 Join 策略,最后 Spark 会利用选择好的 Join 策略执行最终的计算。当前 Spark 一共支持五种 Join 策略:
Broadcast hash join (BHJ)
Shuffle hash join(SHJ)
Shuffle sort merge join (SMJ)
Shuffle-and-replicate nested loop join,又称笛卡尔积(Cartesian product join)
Broadcast nested loop join (BNLJ)
其中 BHJ
和 SMJ
这两种 Join 策略是我们运行 Spark 作业最常见的。JoinSelection
会先根据 Join
的 Key 为等值 Join 来选择Broadcast hash join
、Shuffle hash join
以及Shuffle sort merge join
中的一个;如果 Join 的 Key 为不等值 Join 或者没有指定 Join 条件,则会选择 Broadcast nested loop join
或 Shuffle-and-replicate nested loop join