Spark的join类型和策略

一、Spark的join类型和策略

1.1 join类型
Spark中,join操作用于将两个数据集按照指定的键进行连接。Spark支持以下几种join类型:

1.Inner Join(内连接):仅保留两个数据集中键匹配的记录。

2.Outer Join(外连接):保留两个数据集中的所有记录,如果匹配不上则用null填充。

  • Left Outer Join(左外连接):保留左边数据集中的所有记录,如果匹配不上则用null填充右边数据集的字段。
  • Right Outer Join(右外连接):保留右边数据集中的所有记录,如果匹配不上则用null填充左边数据集的字段。
  • Full Outer Join(全外连接):保留两个数据集中的所有记录,如果匹配不上则用null填充未匹配的字段。

3.Left Semi Join(左半连接):只返回左边数据集中存在匹配的记录,不返回右边数据集的字段。

4.Left Anti Join(左反连接):只返回左边数据集中不存在匹配的记录,不返回右边数据集的字段。

1.2 join策略
Spark根据数据集的大小和分区情况选择合适的join策略来执行连接操作,包括:

1.Broadcast Hash Join(广播哈希连接):当一个数据集可以全部放入内存时,将其广播到其他节点,然后使用哈希连接算法进行连接操作。这种策略适用于小数据集和大数据集之间的连接操作,可以减少数据的传输和网络开销。

2.Shuffle Hash Join(洗牌哈希连接):当两个数据集都无法全部放入内存时,将数据按照连接键进行分区,并将相同键的数据分发到相同节点,然后在每个节点上进行哈希连接操作。这种策略适用于大规模数据集的连接操作,但会涉及到数据的重新分区和网络传输。

3.Sort Merge Join(排序合并连接):当两个数据集都可以按照连接键进行排序时,先对数据进行排序,然后按照排序顺序进行合并操作。这种策略适用于数据集较大且已经排序的情况下,可以减少数据的传输和网络开销。

二、参数介绍和完整代码案例

Spark中进行join操作时,可以通过不同的参数进行配置和调优,以下是一些常用参数的介绍:

  1. joinType:指定连接类型,默认为inner
  2. joinHint:指定连接策略的提示,包括"broadcast""shuffle""sort_merge"
  3. broadcastTimeout:设置广播超时时间,默认为5分钟。
  4. spark.sql.autoBroadcastJoinThreshold:设置自动广播的阈值,默认为10MB
  5. spark.sql.shuffle.partitions:设置洗牌操作的分区数,默认为200

下面是一个完整的Spark代码案例,演示了如何使用不同的join类型和策略:

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()

  .appName("Join Example")

  .getOrCreate()

// 创建两个数据集

val df1 = spark.read.option("header", true)

  .csv("data1.csv")

val df2 = spark.read.option("header", true)

  .csv("data2.csv")

// 注册表

df1.createOrReplaceTempView("table1")

df2.createOrReplaceTempView("table2")

// 内连接

val innerJoinDF = spark.sql("SELECT * FROM table1 JOIN table2 ON table1.id = table2.id")

// 左外连接

val leftOuterJoinDF = spark.sql("SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id")

// 右外连接

val rightOuterJoinDF = spark.sql("SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id")

// 全外连接

val fullOuterJoinDF = spark.sql("SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id")

// 左半连接

val leftSemiJoinDF = spark.sql("SELECT * FROM table1 LEFT SEMI JOIN table2 ON table1.id = table2.id")

// 左反连接

val leftAntiJoinDF = spark.sql("SELECT * FROM table1 LEFT ANTI JOIN table2 ON table1.id = table2.id")

// 设置广播阈值

spark.conf.set("spark.sql.autoBroadcastJoinThreshold", "10000000")

// 广播哈希连接

val broadcastJoinDF = spark.sql("SELECT /*+ BROADCAST(table2) */ * FROM table1 JOIN table2 ON table1.id = table2.id")

// 洗牌哈希连接

val shuffleHashJoinDF = spark.sql("SELECT * FROM table1 JOIN table2 ON table1.id = table2.id")

// 排序合并连接

val sortMergeJoinDF = spark.sql("SELECT * FROM table1 JOIN table2 ON table1.id = table2.id")

// 打印结果

innerJoinDF.show()

leftOuterJoinDF.show()

rightOuterJoinDF.show()

fullOuterJoinDF.show()

leftSemiJoinDF.show()

leftAntiJoinDF.show()

broadcastJoinDF.show()

shuffleHashJoinDF.show()

sortMergeJoinDF.show()

spark.stop()

三、总结

以上代码演示了如何使用Spark进行不同类型和策略的join操作,并通过spark.sql方法执行SQL语句进行连接操作。根据实际情况,可以根据需要设置不同的连接类型和策略,并通过调优参数来提高执行效率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

研发咨询顾问

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

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

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

打赏作者

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

抵扣说明:

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

余额充值