【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.mzph.cn/web/62547.shtml

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

相关文章

php:完整部署Grid++Report到php项目,并实现模板打印

一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…

web安全攻防入门教程

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求:在做前端开发的时候,有的时候 这个项目需要 node 14 那个项目需要 node 16,我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址:https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示: 新版加上MeshCollider后的效果: 注意:在Unity中,当你动态地更改物体的Mesh时,通常期望…

AR眼镜_消费级工业AR智能眼镜主板硬件解决方案

AR眼镜的研发是一项复杂的软硬件集成工程,它需要在摄影、音频、交互和连接等多个方面提供卓越的基础体验,因此产品的每个细节都显得尤为重要。 在设计AR眼镜时,重量、体积和散热性能都是必须认真考量的关键因素。在芯片平台的选择上&#xff…

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法,我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响,因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

Ubuntu 安装 web 服务器

安装 apach sudo apt install apache2 -y 查看 apach2 版本号 apache2 -v 检查是否启动服务器 sudo service apache2 status 检查可用的 ufw 防火墙应用程序配置 sudo ufw app list 关闭防火墙 sudo ufw disable 更改允许通过端口流量 sudo ufw allow Apache Full 开启…

如何落地文件即服务?--- 基于makeself封装服务并启动

我通常想能不能给客户一个文件,然后客户通过执行这个简单的指令就可以吧,一个服务在本地起来? 这是一种文件即服务的思想,不知道你有没有类似的想法,当我发现https://makeself.io/ ,我觉得它能很好的解决我…

IDEA方法注释模板设置

目录 创建模板 新建模板:命名为* 设置模板内容-IDEA格式模板 设置模板应用场景 设置参数 创建模板 /**Enter这里我们也按照这种习惯来设置IDEA的方法注释:File-->Settings-->Editor-->Live Templates 先新建模板组,然后在模板组中…

深度学习笔记之BERT(五)TinyBERT

深度学习笔记之TinyBERT 引言回顾:DistilBERT模型TinyBERT模型结构TinyBERT模型策略Transformer层蒸馏嵌入层蒸馏预测层蒸馏 TinyBERT模型的训练效果展示 引言 上一节介绍了 DistilBERT \text{DistilBERT} DistilBERT模型,本节将继续介绍优化性更强的知…

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景🎈1.1. 模式匹配🎈1.2. 文本替换🎈1.3. 数据验证🎈1.4. 信息提取🎈1.5. 拆分字符串🎈1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

appium学习之二:adb命令

1、查看设备 adb devices 2、连接 adb connect IP:端口 3、安装 adb install xxx.apk 4、卸载 adb uninstall 【包名】 5、把对应目录下的1.txt文件传到手机sdcard下 adb push 1.txt /sdcard 6、进入对应的设备里 adb shell 7、切入sdcard目录 cd /sdcard 8、ls 查…

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能,本文向你展示其数据可视化功能,并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分,无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…

Python实现中国象棋

探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…

互联网、物联网的相关标准

互联网的相关标准 网络通信协议: HTTP(Hypertext Transfer Protocol):用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型,客户端发送请求给服务器,服务器返回响应。HTTPS&a…

学习Ajax (概述,应用场景,使用jQury 实现ajax)

目录 前言 概述 什么是Ajax? 同步交互与异步交互的区别是什么呢? 应用场景 场景1 在搜索框搜索 资源 场景2 登录业务的对用户名处理 AJAX的优缺点 优点: 缺点: 使用jQury 实现ajax 使用步骤 1 引入jQury 文件 2 使用Ajax 函数…

网迅通推出新一代智能家居拓展网关

Zigbee 型智能家居拓展网关 产品概述 A、概述 Zigbee 是一种短距离、低功耗的无线通信技术名称。其特点是近距离、低复杂度、低功耗、低数据速率、低成本。ZigBee 模块是一种物联网无线数据终端,利用 ZigBee 网络为用户提供无线数据传输功能。该产品采用高性能的…

ArcGIS字符串补零与去零

我们有时候需要 对属性表中字符串的补零与去零操作 我们下面直接视频教学 下面看视频教学 ArcGIS字符串去零与补零 推荐学习 ArcGIS全系列实战视频教程——9个单一课程组合 ArcGIS10.X入门实战视频教程(GIS思维) ArcGIS之模型构建器(Mod…

NIFI使用

1 从Kafka接收消息,存储到数据库中。 (1) ConsumerKafka processor (2)Execute Scripts Processor 我这里是使用JS脚本进行处理。 还有很多其他语言的脚本。 var flowFile session.get(); if (flowFile ! null) {v…

kubeadm安装K8s集群之高可用组件keepalived+nginx

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群之高可用组件keepalivednginx 1.安装kubeadm、kubectl、kubelet2.安装高…