【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,一经查实,立即删除!

相关文章

socket UDP 环路回显的服务端

基于socket通讯的方式&#xff0c;无论用http或者udp或者自定义的协议&#xff0c;程序结构都是类似的。这个以UDP协议为例简要说明。 #include <stdio.h> // 标准输入输出库 #include <sys/types.h> // 提供了一些数据类型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的时候自动添加一个本地路由

文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力链媒体播放器

Magnet Player&#xff1a;一款基于Web的磁力链媒体播放器 项目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一个创新的开源项目&#xff0c;它允许用户直接在浏览器中播放磁力链&#xff08;Magnet URI&#xff09;内容&#xff0c;无需下载或安装任何桌面应用…

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

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

web安全攻防入门教程

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

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

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

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

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

OpenCV--特征匹配

OpenCV--特征匹配 代码和笔记 代码和笔记 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配&#xff1a;使用第一组&#xff08;第一幅图&#xff09;中的一个特征描述子&#xff0c;使用一些距离计算与第二组中…

什么是自动化办公

自动化办公是指使用技术工具或软件&#xff0c;通过预设流程或脚本&#xff0c;自动执行日常办公任务&#xff0c;从而提升效率、减少错误、节约时间的办公模式。它适用于需要重复性、规则明确的工作流程&#xff0c;让员工将精力集中在更具创造性和战略性的工作上。 自动化办公…

常见排序算法总结 (四) - 快速排序与随机选择

快速排序 算法思想 每一轮在数组相应的范围上随机找一个元素进行划分&#xff0c;将不大于它的所有元素都放到左边&#xff0c;将大于它的元素都放到右边。在左右两个子数组上不断地递归&#xff0c;直到整个数组上有序。 注意&#xff1a;实现时选择的时参考荷兰国旗问题优化…

unraid固态硬盘分区格式—默认1MiB对齐

背景 我的unraid中有三个机械硬盘和两个固态硬盘&#xff0c;其中两个固态硬盘组成zfs镜像的cache&#xff0c;防止其中一个硬盘出问题导致数据丢失。然而&#xff0c;今天突然看到机械硬盘的分区格式为GPT 4k&#xff0c;而固态硬盘是MBR 1MiB。想到GPT更加优秀&#xff0c;并…

Flutter 图片编辑板(一) 事件路由

一个图片编辑板&#xff0c;有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget&#xff0c;具有缩放偏移的功能。 在图片编辑板上&#xff0c; 会有多个内容相&#xff0c;图片或文字&#xff08;添加文字目前还没做过&#xff09;。 当要编辑其中…

数仓技术hive与oracle对比(一)

准备 包括软硬件环境、数据、测试数据三方面的准备内容。 环境 虚拟机软件virtualbox7&#xff0c;同样的虚拟机配置&#xff1a;内存2G、cpu一核&#xff0c;物理主机同一台macbookpro&#xff08;13-2020款&#xff09;&#xff0c;所以硬盘IO读写速度一致。 综上&#x…

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

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

通信原理概论复习笔记(1)

1 绪论 消息: 通信系统传输对象, 信息的载体和物理表现形式. 信息: 消息的有效内容和内涵. 信号: 消息的传输载体. 模拟通信: 信源 → \to → 调制器 → \to → 信道(噪声) → \to → 解调器 → \to → 信宿. 数字通信: 信源 → \to → 信源编码(压缩数字化) → \to →…

ASPICE评估如何优化软件开发、测试和部署流程

ASPICE&#xff08;Automotive SPICE&#xff0c;即汽车软件过程改进及能力评定&#xff09;评估在提高软件开发、测试、部署的速度和质量方面发挥着重要作用。以下是ASPICE评估如何具体提高这些环节的具体方式&#xff1a; 一、提高软件开发效率 标准化流程&#xff1a;ASPIC…

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 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封装服务并启动

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

mysql集群MHA方式部署

1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-5.7.43192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …