【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助,别忘了点赞、分享或关注哦!您的一点小小支持,不仅能帮助更多人找到有价值的内容,还能鼓励我持续分享更多精彩的技术文章。感谢您的支持,让我们一起在技术的世界中不断进步!

Spark Join类型

在这里插入图片描述

1. Inner Join (内连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "inner")
    
  • 执行逻辑:只返回那些在两个表中都有匹配的行。
2. Left Join (左外连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left")
    
  • 执行逻辑:返回左表的所有记录,并且右表的匹配行,若右表没有匹配行则返回 null
3. Right Join (右外连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "right")
    
  • 执行逻辑:返回右表的所有记录,并且左表的匹配行,若左表没有匹配行则返回 null
4. Full Join (全外连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "outer")
    
  • 执行逻辑:返回左表和右表的所有记录,若某一方没有匹配,另一方则填充 null
5. Left Semi Join (左半连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left_semi")
    
  • 执行逻辑:返回左表中与右表匹配的行,只返回左表数据,不返回右表。
6. Left Anti Join (左反连接)
  • 示例
    val result = df1.join(df2, df1("id") === df2("id"), "left_anti")
    
  • 执行逻辑:返回左表中不与右表匹配的行。
7. Cross Join (笛卡尔积连接)
  • 示例
    val result = df1.crossJoin(df2)
    
  • 执行逻辑:返回两表的笛卡尔积,左表的每一行与右表的每一行组合。

Spark Join实现方式

在 Spark 中,Join 操作有多种实现方式,每种方式的实现原理、适用场景和执行性能有所不同。接下来我们详细讨论以下几种常见的
Join 实现方式:

在这里插入图片描述

1. CPJ(Cartesion Product Join)笛卡尔积连接

工作原理:

  • 笛卡尔积连接是最基础的连接方式,它将两个数据集的每一条记录与另一个数据集的每一条记录进行配对,从而生成一个新的结果集。这个操作是非常低效的,因为它会产生
    N * M 条记录(NM 分别是两个数据集的行数)。
  • 这种方式不需要连接条件,因此通常不是我们期望的连接类型。

执行性能:

  • 效率低:当两个数据集的大小很大时,计算量将急剧增加。通常,笛卡尔积连接仅在明确需要时使用(例如,计算所有可能的配对)。

Spark 选择笛卡尔积的情况:

  • 笛卡尔积连接在 Spark 中通常是显式调用 crossJoin() 时使用。
2. SMJ(Shuffle Sort Merge Join)排序归并连接

工作原理:

  • 排序归并连接首先对两个数据集按照连接键进行排序,然后使用 merge 操作将排序后的数据集进行合并。数据集会被按连接键进行 shuffle,然后在每个分区内执行归并操作。
  • 这种方法非常适合处理大规模的分布式数据,尤其是当两个数据集都很大并且有良好的分区时。

执行性能:

  • 效率较高:适合大数据量的连接,尤其当连接键有排序特性时。
  • 由于需要对数据进行排序和 shuffle,这会增加网络和磁盘的 I/O 成本。

Spark 选择 SMJ 的情况:

  • 当数据集较大并且 Spark 能够进行有效的 shuffle 操作时,Spark 会选择 SMJ
  • 如果连接的表已经分区或有排序字段,则 Spark 会优先选择该方式。
3. SHJ(Shuffle Hash Join)哈希连接

工作原理:

  • 哈希连接(SHJ) 是一种基于哈希表的连接方式。其基本思想是将一个表(通常是较小的表)哈希到内存中,然后通过哈希表查找另一个表的匹配记录。该方法特别适合处理大规模的数据集,尤其是当连接的两个数据集都比较大时,或者当连接键不具有顺序或排序特性时。
  • 执行步骤
    1. 分区阶段(Shuffle):首先,Spark 会将两个数据集根据连接键进行 shuffle(重分区),确保具有相同连接键的记录被发送到同一个节点。此时,数据会按照连接键进行重分区。
    2. 构建哈希表:选择较小的表(通常是内表),在每个节点上对该表进行哈希,构建哈希表。哈希表存储连接键及其对应的记录。
    3. 匹配查找:然后,在同一个节点上扫描较大的表(外表),对于每一条记录,使用相同的连接键查找哈希表中的匹配项。如果匹配,则生成结果。

执行性能:

  • 高效:相比传统的嵌套循环连接(NLJ),哈希连接通常在处理大数据集时更为高效,特别是当连接条件是等值连接时。

Spark 选择 SHJ 的情况:

  • 外表大小至少是内表的3倍且内表的数据分片平均大小要小于广播变量阈值,Spark 会选择 Shuffle Hash Join
4. BNLJ(Broadcast Nested Loop Join)广播嵌套循环连接

工作原理:

  • 广播嵌套循环连接是嵌套循环连接的一种优化形式,针对连接的一个表较小的情况。它首先将较小的表(通常是内表)广播到所有执行节点,然后对大表(通常是外表)进行扫描。在每个节点上,将小表加载到内存中,并在每个分区上与外表进行连接。

执行性能:

  • 高效:相比于传统的嵌套循环连接(Nested Loop Join),广播嵌套循环连接的效率较高,因为它通过将小表广播到每个节点,避免了全局的 shuffle 操作,减少了数据传输的延迟。
  • 适合当一个表非常小(例如,broadcast() 小表时)时,执行性能特别好。

Spark 选择 BNLJ 的情况:

  • Spark 会自动选择 Broadcast Nested Loop Join,当数据集中的一个表较小(可以放入内存)时,Spark 会选择该表进行广播,从而提高连接操作的性能。通常,Spark
    会根据表的大小和内存限制来决定是否使用广播 join
5. BHJ(Broadcast Hash Join)广播哈希连接

工作原理:

  • 广播哈希连接通过将一个小表广播到所有执行节点,从而避免了全局的 shuffle 操作。大的数据集会被分配到多个节点,而小的数据集会被广播到每个节点。
  • 这种方式非常高效,适用于连接一个大表和一个小表的情况。

执行性能:

  • 效率非常高:适用于大表和小表连接,避免了大规模的 shuffle 操作。
  • 适合当一个表非常小(例如,broadcast() 小表时)时,执行性能特别好。

Spark 选择 BHJ 的情况:

  • 如果其中一个表很小,Spark 会选择 BHJ,因为将小表广播到所有节点可以大大减少 shuffle 的开销。
Spark 如何选择 Join 策略?
1. 等值 Join

在等值数据关联中,Spark 会尝试按照以下顺序选择最优的连接策略:

  1. BHJ(Broadcast Hash Join)
  2. SMJ(Shuffle Sort Merge Join)
  3. SHJ(Shuffle Hash Join)

适用场景:

  • BHJ(Broadcast Hash Join): 连接类型不能是全连接(Full Outer Join),基表需要足够小,能够放入内存并通过广播发送到所有节点。
  • SMJ(Shuffle Sort Merge Join)与 SHJ(Shuffle Hash Join):支持所有连接类型,如Full Outer Join,Anti join

为什么SHJ比SMJ执行效率高,排名却不如SMJ靠前

  • 相比 SHJ,Spark优先选择SMJ的原因在于,SMJ的实现方式更加稳定,更不容易OOM
  • 在 Spark 中,SHJ(Shuffle Hash Join) 策略要想被选中,需要满足以下两个先决条件:
    • a. 外表大小至少是内表的 3 倍:只有当内外表的尺寸悬殊到一定程度时,SHJ 的性能优势才会明显超过 SMJ。
    • b. 内表的数据分片平均大小要小于广播变量阈值:内表的数据分片必须足够小,以便能够通过广播传递到各个节点,而不引起内存溢出或性能问题。
  • 相比 SHJ,SMJ没有这么多的附加条件,无论是单表排序,还是两表做归并关联,都可以借助磁盘来完成。内存中放不下的数据,可以临时溢出到磁盘
2. 非等值 Join
  • 在非等值数据关联中,Spark可选的Join策略只有BNLJ(Broadcast Nested Loop Join)和CPJ(Cartesion Product Join),BNLJ适合内表满足广播情况,否则只能用CPJ兜底

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489511.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 响应式原理:基于 Proxy 的深度解析与实践

# Vue3 响应式原理:基于 Proxy 的深度解析与实践 引言 在 Vue3 中,响应式系统采用了基于 Proxy 的实现方式,通过 Proxy 对象的代理和反射能力,实现了更加高效、灵活和强大的数据监听和变更检测机制。本文将深度解析 Vue3 的响应式…

Linux DNS 协议概述

1. DNS 概述 互联网中,一台计算机与其他计算机通信时,通过 IP 地址唯一的标志自己。此时的 IP 地址就类似于我们日常生活中的电话号码。但是,这种纯数字的标识是比较难记忆的,而且数量也比较庞大。例如,每个 IPv4 地址…

PH热榜 | 2024-12-13

1. AI Santa by Tavus 标语:随时随地,视频连线圣诞老人! 介绍:准备好迎接AI圣诞老人了吗?塔武斯公司推出的这款神奇的节日体验,能让你实时用30多种语言与圣诞老人对话,看看自己今年是乖孩子还…

【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题

目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 🐇 图形化界面实现 🐇 纯代码形式实现 1.2 使用 按钮 实现 🐋 图形化界面实现 🐋 纯代码形式实现 1.3 使用 编辑框 实现 🥝 图形化界面实现 &#x1f95…

pytest入门一:用例的执行范围

从一个或多个目录开始查找,可以在命令行指定文件名或目录名。如果未指定,则使用当前目录。 测试文件以 test_ 开头或以 _test 结尾 测试类以 Test 开头 ,并且不能带有 init 方法 测试函数以 test_ 开头 断言使用基本的 assert 即可 所有的…

科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…

ArcGIS MultiPatch数据转换Obj数据

文章目录 ArcGIS MultiPatch数据转换Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS MultiPatch数据转换Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> Obj 2.…

(5)4T刷题-逻辑代数基础

(1)逻辑函数的常用表示方法有:真值表、逻辑图、卡诺图、函数表达式 逻辑函数的表达方法中具有唯一性的是:真值表和卡诺图 (2)异或运算(题干意思不明确,应该是按位异或) …

Linux(网络基础和网络标准OSI七层结构)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

向达梦告警日志说声hello

为了调试和跟踪一些业务功能,通常会创建一个日志表,写入每个关键步骤的信息。也可以向达梦数据库的告警日志输出信息,然后通过查看告警日志即可。 在达梦的告警日志中输出一个信息可以这样 SQL> DBMS_SYSTEM.KSDWRT(2,hi dm);

详解 ES6 Reflect

一. 概念 Reflect 是 ES6 中新增的一个内置对象,它提供了一组静态方法,用于操作对象。这些方法与 Object 上的方法具有相同的功能。在这些方法中会调用对应 Object 上的方法,并且返回对应结果。Reflect 的出现主要是为了将一些 Object 对象上…

图像分割数据集海洋水体船只分割数据集labelme格式6123张3类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):6123 标注数量(json文件个数):6123 标注类别数:3 标注类别名称:["water","sea_obstacle",&…

Docker Compose--安装本地maven

原文网址:Docker Compose--安装本地maven-CSDN博客 简介 本文介绍如何使用Docker Compose安装maven。 脚本及配置 路径:/work/env/maven ├── app ├── config │ └── settings.xml ├── docker-compose.yml ├── repository └── t…

EDA - Spring Boot构建基于事件驱动的消息系统

文章目录 概述事件驱动架构的基本概念工程结构Code创建事件和事件处理器创建事件总线创建消息通道和发送逻辑创建事件处理器消息持久化创建消息发送事件配置 Spring Boot 启动类测试消息消费运行项目 概述 在微服务架构和大规模分布式系统中,事件驱动架构&#xff…

数据链路层(Java)(MAC与IP的区别)

以太网协议: "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等; 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等; 以太…

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现: 1、存储结构出错; 2、数据删除; 3、文件系统格式化; 4、其他原因数据丢失。 UNIX系统常见故障解决方案: 1、检测UNIX系统故障涉及的设备是否存在硬件故障,如果存在硬件故障&#xf…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

【竞技宝】LOL:JDG官宣yagao离队

北京时间2024年12月13日,在英雄联盟S14全球总决赛结束之后,各大赛区都已经进入了休赛期,目前休赛期也快进入尾声,LPL大部分队伍都开始陆续官宣转会期的动向,其中JDG就在近期正式官宣中单选手yagao离队,而后者大概率将直接选择退役。 近日,JDG战队在官方微博上连续发布阵容变动消…

谷歌浏览器的多账户设置与管理

在数字化时代,我们常常需要在不同的网站和服务上使用多个账户。为了方便管理和保护隐私,谷歌浏览器提供了多账户设置功能。本文将详细介绍如何在Chrome中进行多账户设置与管理,并涵盖一些相关的安全配置和问题解决方法。(本文由ht…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…