零基础入门 Spark
吴磊
前 FreeWheel 机器学习研发经理
19171 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
零基础入门 Spark
15
15
1.0x
00:00/00:00
登录|注册

17 | 数据关联:不同的关联形式与实现机制该怎么选?

你好,我是吴磊。
在上一讲,我们学习了 Spark SQL 支持的诸多算子。其中数据关联(Join)是数据分析场景中最常见、最重要的操作。毫不夸张地说,几乎在所有的数据应用中,你都能看到数据关联的“身影”。因此,今天这一讲,咱们继续详细说一说 Spark SQL 对于 Join 的支持。
众所周知,Join 的种类非常丰富。如果按照关联形式(Join Types)来划分,数据关联分为内关联、外关联、左关联、右关联,等等。对于参与关联计算的两张表,关联形式决定了结果集的数据来源。因此,在开发过程中选择哪种关联形式,是由我们的业务逻辑决定的。
而从实现机制的角度,Join 又可以分为 NLJ(Nested Loop Join)、SMJ(Sort Merge Join)和 HJ(Hash Join)。也就是说,同样是内关联,我们既可以采用 NLJ 来实现,也可以采用 SMJ 或是 HJ 来实现。区别在于,在不同的计算场景下,这些不同的实现机制在执行效率上有着天壤之别。因此,了解并熟悉这些机制,对咱们开发者来说至关重要。
今天,我们就分别从这两个角度,来说一说 Spark SQL 当中数据关联的来龙去脉。

数据准备

为了让你更好地掌握新知识,我会通过一个个例子,为你说明 Spark SQL 数据关联的具体用法。在去介绍数据关联之前,咱们先把示例中会用到的数据准备好。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spark SQL提供了丰富的数据关联支持,包括内关联、外关联、左半关联、左逆关联等多种形式。本文通过详细示例和解释,帮助读者快速理解这些关联形式的概念和用法。同时介绍了不同的关联机制,如NLJ、SMJ和HJ,以及它们在执行效率方面的差异。读者可以全面了解Spark SQL中数据关联的技术特点,为日常开发提供了灵活取舍的能力,并培养了以性能为导向的开发习惯。NLJ算法简单直观但执行效率较差,SMJ通过排序和归并提高了效率,而HJ以空间换时间,降低了计算复杂度。掌握不同的关联形式和实现机制,有利于满足不断变化的业务需求,并培养以性能为导向的开发习惯。 Spark SQL支持的关联形式多种多样,方便开发者在不同场景下进行数据关联。同时,NLJ、SMJ和HJ三种实现机制各有特点,适用于不同的数据关联场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础入门 Spark》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 实数
    对于被连接的数据子集较小的情况,Nested嵌套循环连接是个较好的选择 Hash Join散列连接是CBO 做大数据集连接时的常用方式 SortMergeJoin    通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。可以使用来强制使用排序合并连接

    作者回复: 满分💯~

    2021-12-11
    17
  • Eazow
    老师,请问join是是分布式处理吗?

    作者回复: 取决于是单机join,还是分布式join。单机的话,掌握NLJ、SMJ、HJ三种实现机制即可;分布式join的话,还需要考虑是shuffle join,还是Broadcast join~

    2021-12-01
    2
    3
  • LJK
    文中的Sort Merge Join的算法是否只适用于join key在基表中不重复的情况?如果join key在基表中可以重复的话应该需要设定好Mark控制基表的游标位置,不然文中的方法貌似会遗漏数据

    作者回复: SMJ同样适用于数据有重复的情况哈,本质上还是靠游标的滑动,基本上还是那3个规则,按照顺序依次往下滑~ 不过,你说的没错,在这种情况下,游标的滑动,需要保证数据的不重不漏~

    2021-11-04
    4
    2
  • 问下老师,hive里面的join方式,也是老师说的这3种嘛?不考虑 shuffle join,Broadcast join的情况下,,,我的意思是,这3中join方式,是通用的嘛,比如mysql,oracle,hive ,spark 实现join都是这3种方式

    作者回复: 是的,Join的实现机制,是通用的哈,都是NLJ、HJ和SMJ,这三种

    2021-12-19
    1
  • HHB
    无缝对接DBA

    作者回复: 哈哈,是的,Spark SQL的很多优化机制,实际上都来源于RDBMS。实际上,不止Spark SQL,Impala、Presto,任何数仓都是一样的,所谓万变不离其宗~

    2021-11-26
    1
  • 火炎焱燚
    Python 版代码: # 在notebook上运行,先构建环境 from pyspark import SparkContext, SparkConf from pyspark.sql.session import SparkSession sc = SparkContext() spark = SparkSession(sc) seq=[(1, "Mike", 28, "Male"), (2, "Lily", 30, "Female"), (3, "Raymond", 26, "Male"), (5, "Dave", 36, "Male")] employees=spark.createDataFrame(seq,['id','name','age','gender']) seq2=[(1, 26000), (2, 30000), (4, 25000), (3, 20000)] salaries=spark.createDataFrame(seq2,['id','salary']) # inner join jointDF=salaries.join(employees,'id','inner') jointDF.show() # left join jointDF2=salaries.join(employees,'id','left') jointDF2.show() # right join jointDF3=salaries.join(employees,'id','right') jointDF3.show() # outer join jointDF4=salaries.join(employees,'id','outer') jointDF4.show() # leftsemi jointDF5=salaries.join(employees,'id','leftsemi') jointDF5.show() # leftanti jointDF6=salaries.join(employees,'id','leftanti') jointDF6.show()

    作者回复: 赞👍,666~ 辛苦老弟整理Python代码,后续我们一起收录起来~

    2021-10-23
    1
  • LJK
    老师好,NLJ里左表驱动表应该是体量大的表吗?如果有大小两张表,大表是N条数据,小表是M条数据,不考虑block nested loop join优化的话。复杂度是:大表驱动下:O(M*N) + O(M),小表驱动下O(M*N) + O(N),好像应该选择小表驱动?

    作者回复: 不是哈~ 这里没有O(M)、O(N)这样的“尾巴”,两种情况的复杂度都是O(M*N)

    2021-12-06
    3
  • welldo
    先mark,最近要忙项目,忙完再来追。

    作者回复: 老弟加油~

    2021-11-15
  • 李刘明
    SMJ排序不算复杂度?
    2023-06-29归属地:广东
    1
  • Daniel
    请问join的实现方式如何指定呢?
    2022-09-20归属地:上海
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部