17 | 数据关联:不同的关联形式与实现机制该怎么选?
数据准备
- 深入了解
- 翻译
- 解释
- 总结
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-1117 - Eazow老师,请问join是是分布式处理吗?
作者回复: 取决于是单机join,还是分布式join。单机的话,掌握NLJ、SMJ、HJ三种实现机制即可;分布式join的话,还需要考虑是shuffle join,还是Broadcast join~
2021-12-0123 - LJK文中的Sort Merge Join的算法是否只适用于join key在基表中不重复的情况?如果join key在基表中可以重复的话应该需要设定好Mark控制基表的游标位置,不然文中的方法貌似会遗漏数据
作者回复: SMJ同样适用于数据有重复的情况哈,本质上还是靠游标的滑动,基本上还是那3个规则,按照顺序依次往下滑~ 不过,你说的没错,在这种情况下,游标的滑动,需要保证数据的不重不漏~
2021-11-0442 - 福问下老师,hive里面的join方式,也是老师说的这3种嘛?不考虑 shuffle join,Broadcast join的情况下,,,我的意思是,这3中join方式,是通用的嘛,比如mysql,oracle,hive ,spark 实现join都是这3种方式
作者回复: 是的,Join的实现机制,是通用的哈,都是NLJ、HJ和SMJ,这三种
2021-12-191 - HHB无缝对接DBA
作者回复: 哈哈,是的,Spark SQL的很多优化机制,实际上都来源于RDBMS。实际上,不止Spark SQL,Impala、Presto,任何数仓都是一样的,所谓万变不离其宗~
2021-11-261 - 火炎焱燚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-231 - 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-063 - welldo先mark,最近要忙项目,忙完再来追。
作者回复: 老弟加油~
2021-11-15 - 李刘明SMJ排序不算复杂度?2023-06-29归属地:广东1
- Daniel请问join的实现方式如何指定呢?2022-09-20归属地:上海