Spark三种常见JOIN方式

Spark join 基本原理

Spark join的基本实现流程如下图所示,Spark将参与Join的两张表抽象为流式表(StreamTable)和查找表(BuildTable),通常系统会默认设置StreamTable为大表,BuildTable为小表。流式表的迭代器为streamItr,查找表迭代器为BuidIter。Join操作就是遍历streamIter中每条记录,然后从buildIter中查找相匹配的记录。

 

SortMergeJoin

SortMergeJoin是spark默认的join方式。

步骤:

  1. 对两张表分别进行shuffle重分区,之后将相同key的记录分到对应分区,每个分区内的数据在join之前都要进行排序,这一步对应Exchange节点和sort节点。也就是spark 的sort merge shuffle过程。

  2. 遍历流式表,对每条记录都采用顺序查找的方式从查找表中搜索,每遇到一条相同的key就进行join关联。每次处理完一条记录,只需从上一次结束的位置开始继续查找。

BroadcastJoin

BroadcastJoin也叫map join,适用于存在小表的情况。其将小表进行广播,避免shuffle的产生。web ui的sql图可以看到driver collect的时间,build建表压缩时间,broadcast广播时间。需要注意的是:在Outer类型的Join中,基表不能被广播,比如A left outer join B时,只能广播右表B。

触发场景:

  • 被广播表小于参数 spark.sql.autoBroadcastJoinThreshold``=``20971520,默认10MB。

  • 在SQL中显示添加Hint(MAPJOIN、BROADCASTJOIN或BROADCAST),比如想广播a表,就在select后加上/*+MAPJOIN(a)*/。

ShuffledHashJoin

ShuffledHashJoin避免将小表分发到各个executor上,可以减少driver和executor端的压力。

步骤:

  1. 对两张表分别进行shuffle重分区,将相同key的记录分到对应分区中,这一步对应Exchange节点

  2. 将查找表分区构造一个HashMap,然后在流式表中一行行对应查找。

要将来自BuildTable每个分区的记录放到hash表中,那么BuildTable就不能太大,否则就存不下,默认情况下hash join的实现是关闭状态,如果要使用hash join,原生spark必须满足以下四个条件:

  1. 查找表总体估计大小超过spark.sql.autoBroadcastJoinThreshold设定的值,即不满足BroadcastJoin 条件

  2. 关闭优先使用SortMergeJoin开关,spark.sql.join.preferSortMergeJoin=false

  3. 每个分区的平均大小不超过spark.sql.autoBroadcastJoinThreshold设定的值,查找表数据量 < 广播数据阈值 * shuffle的partition数。

  4. streamIter的大小是buildIter三倍以上

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LkChase

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

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

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

打赏作者

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

抵扣说明:

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

余额充值