Spark Join原理是什么

技术Spark Join原理是什么这篇文章将为大家详细讲解有关Spark Join原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。数据分析中将两个数据集进行 Jo

本文将详细讲解什么是Spark Join原理,文章内容质量较高,所以边肖将分享给大家参考。希望你看完这篇文章后有所了解。

JoJoining在数据分析中连接两个数据集是非常常见的场景。在Spark的物理规划阶段,Spark的Join Selection类会根据Join提示策略、Join表的大小、Join是否相等、Join涉及的键是否可以排序来选择最终的Join策略。最后,Spark将使用选定的连接策略来执行最终计算。Spark目前支持五种加入策略:

广播散列连接(BHJ)

无序散列连接(SHJ)

无序排序合并连接(SMJ)

洗牌复制嵌套循环连接,也称为笛卡尔乘积连接。

广播嵌套循环连接(BNLJ)

其中,BHJ和SMJ的加盟策略是我们经营Spark工作最常见的。JoinSelection将首先根据连接的键从广播散列连接、随机散列连接和随机排序合并连接中选择一个作为等价连接;如果联接的键是不等联接或未指定联接条件,将选择广播嵌套循环联接或随机复制嵌套循环联接。不同的Join策略在执行效率上有很大的差异,因此需要了解每个Join策略的执行过程和适用条件。

1、Broadcast Hash Join

广播散列连接的实现是将小表的数据广播给Spark的所有执行器。这个广播过程与我们自己广播数据没有什么不同:

使用collect操作符将小表的数据从executor拉至Driver,调用Driver上的sparkContext.broadcast向所有Executor广播,并使用广播数据加入Executor上的大表(实际上是执行映射操作)。

这种连接策略避免了洗牌操作。一般来说,广播散列连接将比其他连接策略执行得更快。

Spark  Join原理是什么

要使用此连接策略,必须满足以下条件:小表的数据必须非常小,这可以通过spark . SQL . autobroadcastjointhreshold参数进行配置。默认值为10MB。如果内存比较大,可以适当提高阈值。将spark . SQL . autobroadcastjointhreshold参数设置为-1,可以关闭。此连接方法只能用于相等联接,参与联接的键不需要可排序。

2、Shuffle Hash Join

当表中的数据很大,不适合广播时,此时可以考虑使用Shuffle Hash Join。混洗散列连接也是连接大表和小表时选择的一种策略。其计算思路是:按照相同的分区算法和分区号(根据参与Join的键进行分区)对大表和小表进行分区,从而保证哈希值相同的数据分布到同一个分区,然后同一个Executor中两个表的哈希值相同的分区可以在本地进行哈希Join。在加入之前,将为小表的分区构建一个哈希映射。Shuffle hash join利用分治的思想,将大问题分解成小问题来解决。

理是什么">

要启用 Shuffle Hash Join 必须满足以下条件: 仅支持等值 Join,不要求参与 Join 的 Keys 可排序 spark.sql.join.preferSortMergeJoin 参数必须设置为 false,参数是从 Spark 2.0.0 版本引入的,默认值为 true,也就是默认情况下选择 Sort Merge Join 小表的大小(plan.stats.sizeInBytes)必须小于 spark.sql.autoBroadcastJoinThreshold * spark.sql.shuffle.partitions(默认值200) 而且小表大小(stats.sizeInBytes)的三倍必须小于等于大表的大小(stats.sizeInBytes),也就是 a.stats.sizeInBytes * 3 < = b.stats.sizeInBytes

3、Shuffle Sort Merge Join

前面两种 Join 策略对表的大小都有条件的,如果参与 Join 的表都很大,这时候就得考虑用 Shuffle Sort Merge Join 了。 Shuffle Sort Merge Join 的实现思想: 将两张表按照 join key 进行shuffle,保证join key值相同的记录会被分在相应的分区 对每个分区内的数据进行排序 排序后再对相应的分区内的记录进行连接 无论分区有多大,Sort Merge Join都不用把一侧的数据全部加载到内存中,而是即用即丢;因为两个序列都有序。从 头遍历,碰到key相同的就输出,如果不同,左边小就继续取左边,反之取右边。从而大大提高了大数据量下sql join 的稳定性。

Spark Join原理是什么

要启用 Shuffle Sort Merge Join 必须满足以下条件:

仅支持等值 Join,并且要求参与 Join 的 Keys 可排序

4、Cartesian product join

如果 Spark 中两张参与 Join 的表没指定连接条件,那么会产生 Cartesian product join,这个 Join 得到的结果其实

就是两张表行数的乘积。

5、Broadcast nested loop join

可以把 Broadcast nested loop join 的执行看做下面的计算:

for record_1 in relation_1:

for record_2 in relation_2:

join condition is executed

可以看出 Broadcast nested loop join 在某些情况会对某张表重复扫描多次,效率非常低下。从名字可以看出,这种

join 会根据相关条件对小表进行广播,以减少表的扫描次数。

Broadcast nested loop join 支持等值和不等值 Join,支持所有的 Join 类型。 

关于Spark Join原理是什么就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133179.html

(0)

相关推荐

  • 什么是js递归函数调用

    技术什么是js递归函数调用这篇文章主要介绍“什么是js递归函数调用”,在日常操作中,相信很多人在什么是js递归函数调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是js递归函数调用”

    攻略 2021年11月5日
  • 关于Java和.Net的感想有哪些

    技术关于Java和.Net的感想有哪些本篇文章给大家分享的是有关关于Java和.Net的感想有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    攻略 2021年12月2日
  • 如何添加Lombok支持和使用Thymeleaf

    技术如何添加Lombok支持和使用Thymeleaf本篇文章给大家分享的是有关如何添加Lombok支持和使用Thymeleaf,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小

    攻略 2021年11月9日
  • 手指上长疣怎么治疗,手上长的瘊子怎么正确处理

    技术手指上长疣怎么治疗,手上长的瘊子怎么正确处理瘊子是一种称之为hpv的病毒感染引起的局部增生,长在手上的叫做寻常疣,部分人由于不知道是什么用指甲抠导致指甲周围也长出类似的瘊子叫做甲周疣手指上长疣怎么治疗。治疗瘊子的主要

    生活 2021年10月27日
  • Python如何移植到IMX6ULL开发板上

    技术Python如何移植到IMX6ULL开发板上这篇文章主要讲解了“ Python如何移植到IMX6ULL开发板上”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ Pyth

    攻略 2021年11月23日
  • HBase协处理器加载的方式有哪些

    技术HBase协处理器加载的方式有哪些这篇文章主要介绍“HBase协处理器加载的方式有哪些”,在日常操作中,相信很多人在HBase协处理器加载的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年12月9日