嘴说手画一文搞懂Spark的Join

Spark Sql的Join和关系型数据库Sql的Join有很多相同点,比如inner join、left join、right join、full join,这是二者都有的概念,并且含义相同。

但是,Spark Sql是分布式执行、面对的是海量数据的特点,使得Spark Sql的Join体系要复杂的多。

一,join类型

Spark Sql的join类型分为:

  • inner join
  • left join
  • right join
  • full join

和关系型数据库Sql没有区别。这四种类型定义了join的取数策略,不同join的结果不同。

二,join具体实现手段-Shuffle与Broadcast

基于Spark Sql面对的是海量数据,数据量是实现join必须要考虑的。Spark Sql提供三种实现方式:

  • Hash Join
  • Sort Merge Join
  • Nested Loop Join

1,Nested Loop Join

简称为NLJ,对于两张要join的表,可以理解为两个集合。要找出满足join定义的数据,最直接简单的思路就是暴力循环。

使用两层循环,外循环针对左表,对左表的每一条记录,在内循环中逐条比对右表中的每一条记录,输出符合条件的记录,如果左表的条数为M,右表的条数为N,则算法复杂度为O(M*N)。

2,Sort Merge Join

简称SMJ。这种算法需要两个表的数据是有序的,类似于归并排序,采用两个游标,分别指向两个表:

  • 当两个游标指向的数据能够关联,输出这条数据,左表游标下移
  • 左表数据key小于右表,左表游标下移
  • 左表数据key大于右表,右表游标下移

SMJ算法复杂度是O(M+N),比NLJ要优秀,但SMJ要求左右表数据有序。

3,Hash Join

Hash Join利用Hash值查找是否有匹配的数据。

首先加载右表全表,基于右表key建立Hash字典,字典key是基于某种Hash算法算出来的Hash值,value是源数据行。

遍历左表,对左表key进行hash,在前一步建立的字典查找是否有该hash值,有则进一步判断key是否相同。

Hash Join的效率最高,但需要提前将右表完全加载到内存中,对内存有较高要求。

三,数据分发方式

Spark Sql是在分布式数据集上进行的计算,相同的key可能位于不同的partition,所以需要将相同的key通过网络收集到同一个partition,这就是著名的Shuffle过程。

Shuffle过程中的网络分发会导致性能大大降低,所以,在满足特定条件时,Spark Sql还提供了一种分发数据的方式,即BroadCast广播,Spark将右表通过广播分发到每个Executor,左表的数据无须分发,节省大量的网络IO。

四,实现方式和分发方式相结合

SparkSql的三种实现算法和两种数据分发方式相结合,组合成了6种join。

在这里插入图片描述

  • Broadcast NLJ
  • Broadcast HJ
  • Broadcast SMJ
  • Shuffle NLJ
  • Shuffle HJ
  • Shuffle SMJ

Shuffle与BroadCast

Broadcast 需要满足一定条件,即右表的数据不能太大,Spark规定右表最大不能超过8G,因为Broadcast首先会将数据收集到Driver,然后分发到每一个Executor,所有对Driver和Executor的内存都有要求。

在满足条件时,Spark会首选BroadCast。

如果右表数据量很大,则不能通过Broadcast方式。

HJ/SMJ/NLJ

效率最高的是Hash Join,但HashJoin需要将右表全部加载到内存,容易导致OOM,所以Hash Join并不是Spark的首选,实际上默认并不开启Hash Join。

Spark的首选是SMJ,首先SMJ的效率并不低,且在数据量大时,其可以利用磁盘计算,稳定可靠,是Spark的首选。虽然其要求数据是有序的,但通常在ShuffleWrite过程中,会对数据排序。

最后才会选择NLJ,但NLJ也不是鸡肋,HJ和SMJ都限定于等值Join,非等值Join只能通过NLJ。

彩蛋:

SMJ、NLJ其实挺难记,不过你打篮球的话,会意识到MJ不就是Micheal Jordan吗,或者Micheal Jackson也行。

在这里插入图片描述

LJ不就是LeBron James吗?

在这里插入图片描述

我就是这样记,不容易忘。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值