SparkSQL join的实现

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步:

  • 确定BuildTableProbeTable:通常小表作为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进行排序,然后按照类似堆排序的过程进行匹配,虽然排序消耗了资源但匹配过程却只需要读取一次两表的数据。\