Spark SQL 关联形式和关联机制

Spark SQL 关联形式和关联机制

在前面的学习中,我们学习了 Spark SQL 支持的诸多算子。其中数据关联(Join)是数据分析场景中最常见、最重要的操作。毫不夸张地说,几乎在所有的数据应用中,你都能看到数据关联的“身影”。因此,今天这一讲,咱们继续详细说一说 Spark SQL 对于 Join 的支持。

在数据分析领域,数据关联可以说是最常见的计算场景了。因为使用的频率很高,所以 Spark 为我们准备了非常丰富的关联形式,包括 Inner Join、Left Join、Right Join、Anti Join、Semi Join 等等。

搞懂不同关联形式的区别与作用,可以让我们快速地实现业务逻辑。不过,这只是基础,要想提高数据关联场景下 Spark 应用的执行性能,更为关键的是我们要能够深入理解 Join 的实现原理。所以今天这一讲,我们先来说说,单机环境中 Join 都有哪几种实现方式,它们的优劣势分别是什么。理解了这些实现方式,我们再结合它们一起探讨,分布式计算环境中 Spark 都支持哪些 Join 策略。对于不同的 Join 策略,Spark 是怎么做取舍的。

众所周知,Join 的种类非常丰富。如果**按照关联形式(Join Types)来划分,数据关联分为内关联、外关联、左关联、右关联,等等(**inner、left、right、anti、semi,outer )。对于参与关联计算的两张表,关联形式决定了结果集的数据来源。因此,在开发过程中选择哪种关联形式,是由我们的业务逻辑决定的。

从实现机制的角度,Join 又可以分为 NLJ(Nested Loop Join)、SMJ(Sort Merge Join)和 HJ(Hash Join)。也就是说,同样是内关联,我们既可以采用 NLJ 来实现,也可以采用 SMJ 或是 HJ 来实现。区别在于,在不同的计算场景下,这些不同的实现机制在执行效率上有着天壤之别。因此,了解并熟悉这些机制,对咱们开发者来说至关重要。

数据准备

在去介绍数据关联之前,咱们先把示例中会用到的数据准备好。

import spark.implicits._
import org.apache.spark.sql.DataFrame
 
// 创建员工信息表
val seq = Seq((1, "Mike", 28, "Male"), (2, "Lily", 30, "Female"), (3, "Raymond", 26, "Male"), (5, "Dave", 36, "Male"))
val employees: DataFrame = seq.toDF("id", "name", "age", "gender")
 
// 创建薪资表
val seq2 = Seq((1, 26000), (2, 30000), (4, 25000), (3, 20000))
val salaries:DataFrame = seq2.toDF("id", "salary")

如上表所示,我们创建了两个 DataFrame,一个用于存储员工基本信息,我们称之为员工表;另一个存储员工薪水,我们称之为薪资表。

数据准备好之后,我们有必要先弄清楚一些数据关联的基本概念。所谓数据关联,它指的是这样一个计算过程:给定关联条件(Join Conditions)将两张数据表以不同关联形式拼接在一起的过程。关联条件包含两层含义,

  1. 一层是两张表中各自关联字段(Join Key)的选择
  2. 另一层是关联字段之间的逻辑关系。

在上一讲我们说到,Spark SQL 同时支持 DataFrame 算子与 SQL 查询,因此咱们不妨结合刚刚准备好的数据,分别以这两者为例,来说明数据关联中的基本概念。

image-20240731162936549

首先,约定俗成地,我们把主动参与 Join 的数据表,如上图中的 salaries 表,称作“左表”;而把被动参与关联的数据表,如 employees 表,称作是“右表”。

然后,我们来关注图中蓝色的部分。可以看到,两张表都选择 id 列作为关联字段,而两者的逻辑关系是“相等”。这样的一个等式,就构成了我们刚刚说的关联条件。接下来,我们再来看图中绿色的部分,inner 指代的就是内关联的关联形式

关联机制

不过࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值