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

news2024/12/16 0:55:07

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

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.coloradmin.cn/o/2260211.html

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

相关文章

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Phoenix5.1.3安装

环境说明 准备三台服务器,分别为:bigdata141(作为HBase主节点)、bigdata142、bigdata143,已经搭建好HBase集群,我这边HBase版本为2.2.7另准备一台服务器,bigdata144,作为Phoenix客户…

ASP.NET Core API + MySql

环境 数据库: mysql8.0 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…

小程序维护外包流程和费用

由于某些原因很多老板想要跟换掉小程序原来合作的开发公司,重新把小程序系统维护外包新的公司。小程序系统外包维护是一个涉及多个方面的过程,需要从需求明确、选择团队到持续优化等多个环节进行细致管理。以下就是小程序系统外包维护主要包括几个关键步…

代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC746.使用最小花费爬楼梯

动态规划理论基础 解释:动态规划,英文:Dynamic Programming,简称DP;如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划五部曲: 1、确定dp数组(dp table)…

亮相AICon,火山引擎边缘云揭秘边缘AI Agent探索与实践

12月13-14日,AICon 全球人工智能开发与应用大会在北京成功举办。火山引擎边缘智能技术负责人谢皓受邀出席大会,以《AI Agent 在边缘云的探索与实践》为主题,与全球 AI 领域的资深专家,共同深入探讨大模型落地、具身智能、多模态大…

找出1000以内的所有回文数

找出1000以内的所有回文数 方法概述检查回文数的方法伪代码C代码实现代码解析运行结果在计算机科学中,回文数是一种具有对称性质的数,即从左向右读和从右向左读都是相同的。例如,121、1331、12321都是回文数。本文将利用数据结构、C语言和算法的知识来编写一个程序,找出100…

数据保护策略:如何保障重要信息的安全

一、什么是数据安全? 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程,负责监督信息的收集、存储和传输。 机密性:保护数据免遭未授权方访问。 完整性:保护数据免遭未经授权的修改、损坏…

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学,想必大家对它不是非常陌生了吧,这期呢,我主要是围绕以下几点展开,重点给大家介绍 里…

基于springboot+vue的高校校园交友交流平台设计和实现

文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我? 关于我项目开发案例我自己的网站 源码获取: 系统功能 校园交友平台…

33.攻防世界upload1

进入场景 看看让上传什么类型的文件 传个木马 把txt后缀改为png 在bp里把png改为php 上传成功 用蚁剑连接 在里面找flag 得到

基于Python+Sqlite3实现的搜索和推荐系统

基于Python实现的搜索和推荐系统 一、引言 伴随着科技的不断进步,互联网,万维网的不断发展。我们越来越热爱万维网,也欣赏他的发展方式。20世纪90年代初,万维网还只是一个将文档联系起来的简单网络。如今,他已经成为…

使用idea创建一个JAVA WEB项目

文章目录 1. javaweb项目简介2. 创建2.1 idea新建项目2.2 选择,命名2.3 打开2.4 选择tomcat运行2.5 结果 3. 总结 1. javaweb项目简介 JavaWeb项目是一种基于Java技术的Web应用程序,主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上&a…

【潜意识Java】Java基础教程:从零开始的学习之旅

目录 1. Java 简介 2. Java 程序结构 2.1 包声明(Package Declaration) 2.2 导入语句(Import Statement) 2.3 类声明(Class Declaration) 2.4 main 方法(Main Method) 3. Jav…

算法题(2):三步问题

审题:需要输出小孩上楼梯的方式的数量(需要取模) 思路: 如果正面来思考这个问题会无从下手,因为我们的分类太多了,没有办法把大问题缩小。 但是如果反过来思考,小孩最后一步有几种情况&#xff…

Quad Remesher使用教程

为什么要拓扑? 我们知道,模型在三维软件中的表现,是由一系列的面通过不同角度组合而成的。3D模型制作层面上的拓扑,按我的理解来说,就是一个模型的面的结构分布——布线。想表现和制作一个三维模型,有无限…

Android 使用Overlay现实主题切换

最近项目上,想做一个主题切换的功能,整理了一下发布出来,主要使用的是IOverlayManager,大体思路如下: 1、想切换的应用,各自做overlay apk(简称皮肤包) 2、将overlay apk push 到v…

apk反编译修改教程系列-----超简单修改apk中名称 包名 布局文本以及其中的文字选项 手机设置中apk对应修改演示【三十三】

💝💝💝在反编译apk中,每个初学者可能最感兴趣入门的就是修改包名 去更新以及其中选项文本的修改。这样循序渐进来激发学习的兴趣。了解一些apk中常见的修改方法。对于修改手机rom中的 系统类等等的apk原理都是一样的。这篇是应粉丝需要的修改apk基础教程. 通过博文了解…

02HBuilder工具准备

一、下载网址: HBuilder 使用教程 | 菜鸟教程 DCloud - 数字天堂官网、HBuilderX、HBuilder、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 二、下载 三、解压 四、启动程序