跳到主要内容

Spark join

Spark Join 类型分类都有哪些

1. Broadcast Hash Join

  • 使用条件:数据集的总行数小于MAX_BROADCAST_TABLE_ROWS阈值
  • 原理:将小表的数据广播(broadcast)到 Spark 所有的 Executor 端
  • 过程:先利用 collect 算子将小表的数据从 Executor 端拉到 Driver 端,然后在 Driver 端调用 sparkContext.broadcast 广播到所有 Executor 端;然后在 Executor 端这个广播出去的数据会和大表进行 Join 操作,这种 Join 策略避免了 Shuffle 操作。

2. Shuffle Hash Join

  • 使用条件:仅限于等值join;较小的表要小于广播阈值和shuffle分区数的乘积;小数据集的3倍要小于大数据集。
  • 过程:把大表和小表按照相同的分区算法和分区数进行分区(根据参与 Join 的 keys 进行分区),这样就保证了 hash 值一样的数据都分发到同一个分区中,然后在同一个 Executor 中两张表 hash 值一样的分区就可以在本地进行 hash Join。

3. Suffle Sort Merge Join

  • 使用条件:仅限于等值join;参与join的值可以排序。

  • 过程:对两张表参与 Join 的 Keys 使用相同的分区算法和分区数进行分区,目的就是保证相同的 Keys 都落到相同的分区里面。分区完之后再对每个分区按照参与 Join 的 Keys 进行排序,最后 Reduce 端获取两张表相同分区的数据进行 Merge Join,也就是 Keys 相同数据Join。

4.Cartesian Product Join

  • 使用条件:等值join或不等值join都可;join类型为innerLike。

5.Broadcast nested loop join

  • 会对某张表多次扫描,效率极低

  • 使用条件:支持等值和不等值join;支持所有join类型

Spark Map Join

  1. 原理 将小份数据广播到各个计算节点,加载到内存建立map索引,大份数据作为MapTask的输入,map()去内存中直接进行匹配关联​
  2. 缺点 map索引在遇到相同的key时新数据会覆盖旧数据,因此key值存在重复时要做处理;​ 由于广播时要通过driver端进行,因此增大了driver端内存压力;​ 小数据要广播到每个executor中,因此增加了executor的内存压力。