一、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