SparkSql Join Types详解

本文详细介绍了Spark SQL中的各种JOIN类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN、CROSS JOIN、SEMI JOIN和ANTI JOIN,并通过案例实战展示了每种JOIN类型的使用,帮助读者理解它们的区别和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们都知道join是根据某些条件把两行数据关联起来,而且也熟悉常用的一些join type,如inner、left、right等等,但是有些人可能对semi、anti或者一些语法的缩写和全写搞的不是很清楚,这篇博客就用简单明了的案例把这些都讲明白。

Join语法

relation { [ join_type ] JOIN [ LATERAL ] relation [ join_criteria ] | NATURAL join_type JOIN [ LATERAL ] relation }
  1. 参数
  • relation
    指定要进行join两个或多个表、dataset
  • join_type
    指定关联类型

    [ INNER ] | CROSS | LEFT [ OUTER ] | [ LEFT ] SEMI | RIGHT [ OUTER ] | FULL [ OUTER ] | [ LEFT ] ANTI

  • join_criteria
    指定两个表关联的字段,如 on t1.id = t2.id
  1. join types
  • inner join
    in

### Spark SQL Join 操作的实现机制 在Spark SQL中,Join操作是通过多种策略来优化性能并适应不同规模的数据集。当涉及到两个或更多数据集之间的连接时,Spark会自动选择最合适的算法来进行高效处理。 对于较小的数据集,Broadcast Hash Join (BHJ) 是一种常用的策略。在这种情况下,如果一张表相对较小,则该表会被广播至集群内的每一个工作节点,在这些位置上构建哈希索引并与较大的另一张表进行匹配[^3]。此过程减少了网络传输开销以及磁盘I/O次数,从而提高了查询效率。 而对于较大规模的数据集,默认采用的是Shuffle Hash Join 或者 Sort Merge Join 方法之一: - **Shuffle Hash Join**: 如果两张待关联表格都比较大但是存在一个公共列适合做hash partitioning的话, 那么这两份数据将会按照这个键重新划分(partition),之后再各自内部完成局部聚合计算最后汇总得到最终结果。 - **Sort Merge Join**: 对于那些已经按相同顺序排序过的两组记录来说,这种方法非常有效率;它先对两边的数据流分别排序后再逐条对比查找相等项加入输出列表里去[^1]。 以下是使用Scala编写的简单例子展示如何显式指定broadcast hint以触发Broadcast Hash Join: ```scala import org.apache.spark.sql.functions.broadcast val smallDF = spark.read.parquet("/path/to/small_table") val largeDF = spark.read.parquet("/path/to/large_table") // 使用 broadcast 提示符强制执行 Broadcast Hash Join val result = largeDF.join(broadcast(smallDF), "key") ``` 为了更好地理解上述概念及其应用场景,下面提供了一个具体的实例说明如何创建DataFrame对象并通过SQL方式进行多表联接操作[^2]: ```scala val spark = SparkSession.builder() .appName("aggregations") .master("local[2]") .getOrCreate() val empDF = spark.read.json("/usr/file/json/emp.json") empDF.createOrReplaceTempView("emp") val deptDF = spark.read.json("/usr/file/json/dept.json") deptDF.createOrReplaceTempView("dept") spark.sql(""" SELECT e.name, d.dept_name FROM emp AS e JOIN dept AS d ON e.dept_id = d.id; """) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SunnyRivers

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

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

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

打赏作者

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

抵扣说明:

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

余额充值