Spark的5种join策略详解

一、Spark的5种Join策略?


1.Broadcast Hash Join:这种连接策略使用一个叫做广播散列(Broadcast Hash)的方法,它通过将小数据集(broadcast)加载到每个节点上,然后使用散列将大数据集映射到小数据集上,从而实现快速连接。这种策略适用于小数据集可以轻松装入内存的情况。
2.Shuffled Hash Join:这种连接策略与Broadcast Hash Join类似,但大数据集会被分发到每个节点,并在每个节点上对小数据集进行散列。适用于大数据集不能被完全加载到内存中,但可以接受一定程度的网络shuffle的情况。
3.Broadcast Nested Loop Join:这种连接策略适用于两个数据集都可以完全加载到内存中的情况。它通过在每个节点上对两个数据集进行嵌套循环连接,并使用广播散列将大数据集映射到小数据集上。
4.Shuffled Nested Loop Join:这种连接策略与Broadcast Nested Loop Join类似,但大数据集会被分发到每个节点,并在每个节点上对小数据集进行嵌套循环连接。这种策略适用于大数据集不能被完全加载到内存中,但可以接受一定程度的网络 shuffle 的情况。
5.Cartesian Join:这种连接策略通过简单地组合两个数据集中的所有行对来实现连接。这种策略通常会产生非常大的结果集,因此只适用于非常小的数据集或者需要特殊连接操作的情况。

在Spark中,你可以通过在join函数中设置joinType参数为
broadcast_hash_join、shuffled_hash_join、broadcast_nested_loop_join、shuffled_nested_loop_join或cartesian_join来选择需要的连接策略。
例如:
df1.join(df2, df1("column1") === df2("column2"), "broadcast_hash_join")


二、等值关联使用哪种join策略?


1.有join提示(hints)的情况,按照下面的顺序
    Broadcast Hint:如果join类型支持,则选择broadcast hash join
    Sort merge hint:如果join key是排序的,则选择 sort-merge join
    shuffle hash hint:如果join类型支持, 选择 shuffle hash join
    shuffle replicate NL hint: 如果是内连接,选择笛卡尔积方式
2.没有提示的情况下
    如果join类型支持,并且其中一张表能够被广播(spark.sql.autoBroadcastJoinThreshold值,默认是10MB),则选择 broadcast hash join
    如果参数spark.sql.join.preferSortMergeJoin设定为false,且一张表足够小(可以构建一个hash map) ,则选择shuffle hash join
    如果join keys 是排序的,则选择sort-merge join
    如果是内连接,选择 cartesian join
    没有可以选择的执行策略,则最终选择broadcast nested loop join,即使可能会发生OOM


三、不等关联使用哪种join策略?


1.有join提示(hints),按照下面的顺序
    broadcast hint:选择broadcast nested loop join.
    shuffle replicate NL hint: 如果是内连接,则选择cartesian product join
2.没有join提示(hints),则逐个对照下面的规则
    如果一张表足够小(可以被广播),则选择 broadcast nested loop join
    如果是内连接,则选择cartesian product join
    如果可能会发生OOM或者没有可以选择的执行策略,则最终选择broadcast nested loop join

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值