SparkSQL对于join的实现有3种:
- Hash Join
- Shuffle Hash Join
- Broadcast Hash Join(Map-Side Join)
- Sort Merge Join
下面详细介绍这3种join的实现思路。
1. Hash Join
对两张表join的的过程是对两张表种符合条件的Row进行筛选,最终合并成结果的过程,这个过程使用Hash Join来实现有如下3步:
- 确定
BuildTable
和ProbeTable
:通常小表作为BuildTable,大表作为ProbeTable - 将BuidleTable表中的数据写入HashTable中
- 使用ProbeTable中的记录去HashTable中匹配,相同join_key的生成一条记录
1.1 Broadcast Hash Join
当BuildTable非常小时可以将BuildTable直接广播到ProbeTable所在的各个节点,避免了Shuffle的发生,效率也更高,但如果BuildTable很大时就需要ShuffleHashJoin了。
SparkSQL对于小于10M的表默认使用BroadcastHashJoin,可通过spark.sql.autoBroadcastJoinThreshold
参数调整
1.2 Shuffle Hash Join
当HashTable较大时,广播所带来的资源消耗高于带来的收益,此时只能通过Shuffule将两表的数据按join_key分区后再生成HashTable进行匹配。
2. Sort Merge Join
Hash Join有一个缺陷就是如果BuildTable过大,无法完全存储在内存,此时就需要不断的从磁盘加载HashTable的各个部分,导致性能很低,所以为了优化两张大表的join引入了SortMergeJoin。
SortMergeJoin在Shuffle完成后对两表的记录按join_key进行排序,然后按照类似堆排序的过程进行匹配,虽然排序消耗了资源但匹配过程却只需要读取一次两表的数据。\