一、Sort Merge Join
spark默认的,两张大表进行join时使用
主要包括三个阶段:
- Shuffle阶段:两张大表根据Join key进行shuffle重分区
- Sort阶段:每个分区内的数据进行排序
- Merge阶段:对来自不同表的排序好的分区数据进行join,通过遍历元素连接具有相同key的
二、Broadcast Hash Join
当一张表较小的时候可以使用,比如事实表和维表进行join,可以提高join的效率
主要包括两个阶段:
- Broadcast阶段:将小表分发到大表所在的所有主机
- hash join阶段:在每个executor上执行hash join
通过collect算子将小表的数据拉取到Driver端,然后调用广播方法将小表的数据广播到所有Executor端。在executor端中进行扫描join。这种方法可以避免shuffle
三、Shuffle Hash Join
当小表的数据比设置的小表阈值大,不适用于广播的时候可以考虑
主要包括两个阶段
- shuffle阶段:分别将两个表按照join的key进行分区,将相同join key的记录重分布到同一节点,两张表的数据会被重分区到集群中所有节点
- hash join阶段:每个分区节点的数据单独执行hash join算法
使用条件:①:仅支持等值连接 ②:sortMergeJoin的参数必须位false ③:小表的大小要小于3倍大表的大小
四、Shuffle Sort Merge Join
如果参与Join的表都很大,考虑这种
思想:对两张表参与join的key使用相同的分区算法和分区数进行分区,保证相同的key落到相同的分区中。分区完之后对每个分区按照参与join的key进行排序,最后reduce端获取两张相同分区数据进行Merge Join
五、 Cartesian Join(笛卡尔连接)
没有指定key的时候进行笛卡尔乘积