Spark SQL五大关联策略

这篇具有很好参考价值的文章主要介绍了Spark SQL五大关联策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、五种连接策略

选择连接策略的核心原则是尽量避免shuffle和sort的操作,因为这些操作性能开销很大,比较吃资源且耗时,所以首选的连接策略是不需要shuffle和sort的hash连接策略。

◦Broadcast Hash Join(BHJ):广播散列连接

◦Shuffle Hash Join(SHJ):洗牌散列连接

◦Shuffle Sort Merge Join(SMJ):洗牌排列合并联系

◦Cartesian Product Join(CPJ):笛卡尔积连接

◦Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

2、连接影响因素

2.1、连接类型是否为equi-join(等值连接)

等值连接是指一个连接条件中只包含“=”比较的连接,而非等值连接包含除“=”以外的任何比较,如“<、>、>=、<=”,由于非等值连接是对不确定值的范围比较,需要嵌套循环,所以只有CPJ和BMLJ两种连接策略支持非等值连接,对于等值连接,所有连接策略都支持。

2.2、连接策略提示(Join strategy hint

Spark SQL为开发人员提供了通过连接提示对连接策略选择进行一些控制,共支持4种连接提示(Spark3.0.0版本)。

▪BROADCAST

▪SHUFFLE_MERGE

▪SHUFFLE_HASH

▪SHUFFLE_REPLICATE_NL

使用示例:SELECT

/*+ BROADCAST(table_B) */ *

FROM

table_A

INNER JOIN

table_B

ON

table_A.id = table_B.id

2.3、连接数据集的大小(Size of Join relations)

选择连接策略最重要的因素是连接数据集的大小,是否可以选择不需要shuffle和sort的基于hash的连接策略,就取决于连接中涉及的数据集的大小。

3、连接策略优先级

Spark SQL五大关联策略,spark,sql,大数据

4、五种连接策略运行原理

4.1、Broadcast Hash Join(BHJ):广播散列连接

主要分为两个阶段:

1.**广播阶段:**通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。

2.**关联阶段:**在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。

限制条件:

1.被广播的小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold,默认为10M。

2.基表不能被广播,比如left join时,只能广播右表。

3.数据集的总行数小于MAX_BROADCAST_TABLE_ROWS阈值,阈值被设置为3.41亿行。

Spark SQL五大关联策略,spark,sql,大数据

**4.2、**Shuffle Hash Join(SHJ):洗牌散列连接

主要分为两个阶段:

1.**洗牌阶段:**通过对两张表分别按照join key分区洗牌,为了让相同join key的数据分配到同一Executor中。

2.**关联阶段:**在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。

限制条件:

1.小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold(默认为10M) * shuffle分区数。

2.基表不能被广播,比如left join时,只能广播右表。

3.较小表至少比较大表小3倍以上,否则性能收益未必大于Shuffle Sort Merge Join。

Spark SQL五大关联策略,spark,sql,大数据

4.3、Shuffle Sort Merge Join(SMJ):洗牌排列合并联系

主要分为两个阶段:

1.**洗牌阶段:**将两张大表分别按照join key分区洗牌,为了让相同join key的数据分配到同一分区中。

2.**排序阶段:**对单个分区的两张表分别进行升序排序。

3.**关联阶段:**两张有序表都可以作为stream table或build table,顺序迭代stream table行,在build table顺序逐行搜索,相同键关联,由于stream table或build table都是按连接键排序的,当连接过程转移到下一个stream table行时,在build table中不必从第一个行搜索,只需从与最后一个stream table匹配行继续搜索即可。

限制条件:

1.连接键必须是可排序的。

Spark SQL五大关联策略,spark,sql,大数据

4.4、Cartesian Product Join(CPJ):笛卡尔积连接

主要分为两个阶段:

1.**分区阶段:**将两张大表分别进行分片,再将两个父分片a,b进行笛卡尔积组装子分片,子分片数量:a*b。

2.**关联阶段:**会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。

限制条件:

1.left join广播右表,right join广播左表,inner join广播两张表。

Spark SQL五大关联策略,spark,sql,大数据

4.5、Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

主要分为两个阶段:

1.**广播阶段:**通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。

2.**关联阶段:**会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。

限制条件:

1.仅支持内连接。

2.开启参数:spark.sql.crossJoin.enabled=true。

Spark SQL五大关联策略,spark,sql,大数据

作者:曲海龙

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-832369.html

到了这里,关于Spark SQL五大关联策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark大数据处理讲课笔记4.1 Spark SQL概述、数据帧与数据集

      目录 零、本讲学习目标 一、Spark SQL (一)Spark SQL概述 (二)Spark SQL功能 (三)Spark SQL结构 1、Spark SQL架构图 2、Spark SQL三大过程 3、Spark SQL内部五大组件 (四)Spark SQL工作流程 (五)Spark SQL主要特点 1、将SQL查询与Spark应用程序无缝组合 2、Spark SQL以相同方式连接多种数据

    2024年02月09日
    浏览(63)
  • Spark大数据处理讲课笔记4.2 Spark SQL数据源 - 基本操作

      目录 零、本讲学习目标 一、基本操作 二、默认数据源 (一)默认数据源Parquet (二)案例演示读取Parquet文件 1、在Spark Shell中演示 2、通过Scala程序演示 三、手动指定数据源 (一)format()与option()方法概述 (二)案例演示读取不同数据源 1、读取房源csv文件 2、读取json,保

    2024年02月09日
    浏览(43)
  • 4.5 Spark SQL 处理JSON数据

    4.1 Spark SQL概述 4.2 Spark SQL DataFrame 编程操作大全 (超详细)

    2024年02月02日
    浏览(53)
  • 电影评分数据分析案例-Spark SQL

    1. 2. 3. 4. 5. 6.

    2024年02月08日
    浏览(67)
  • Spark SQL数据源 - 基本操作

    一、案例演示读取Parquet文件 执行命令: cd $SPARK_HOME/examples/src/main/resources ,查看Spark的样例数据文件users.parquet 将数据文件users.parquet上传到HDFS的/datasource/input目录 二、在Spark Shell中演示 启动Spark Shell,执行命令: spark-shell --master spark://master:7077 执行命令: val userdf = spark.read

    2024年02月09日
    浏览(40)
  • Spark SQL数据源:Hive表

    Spark SQL还支持读取和写入存储在Apache Hive中的数据。然而,由于Hive有大量依赖项,这些依赖项不包括在默认的Spark发行版中,如果在classpath上配置了这些Hive依赖项,Spark就会自动加载它们。需要注意的是,这些Hive依赖项必须出现在所有Worker节点上,因为它们需要访问Hive序列化

    2024年02月11日
    浏览(36)
  • Spark SQL数据源的基本操作

    Spark SQL提供了两个常用的加载数据和写入数据的方法:load()方法和save()方法。load()方法可以加载外部数据源为一个DataFrame,save()方法可以将一个DataFrame写入指定的数据源。 默认情况下,load()方法和save()方法只支持Parquet格式的文件,Parquet文件是以二进制方式存储数据的,因此

    2024年02月09日
    浏览(45)
  • spark sql 查看全部数据库的表

    大数据环境下,metastore一般都交个hive处理,随着数据库 表 越来越多,进行源数据管理的就会成为痛点,如何能够查询出所有的数据库下的所有表 Spark 官方文档Tables 官方给的sample中,只能一个库一个库查询,如果有成百上千个库呢? 从 Python 3.6 开始,Python f 字符串可用。

    2024年02月14日
    浏览(38)
  • 4.2 Spark SQL数据源 - 基本操作

    案例演示读取Parquet文件 查看Spark的样例数据文件users.parquet 1、在Spark Shell中演示 启动Spark Shell 查看数据帧内容 查看数据帧模式 对数据帧指定列进行查询,查询结果依然是数据帧,然后通过write成员的save()方法写入HDFS指定目录 查看HDFS上的输出结果 执行SQL查询 查看HDFS上的输

    2024年02月08日
    浏览(43)
  • 使用Spark SQL读取阿里云OSS的数据

    创建一个table,并关联OSS目录路径 如果数据文件是 Parquet 格式的,可以自动推断出表的schema,很方便。 这样就可以使用sql语句读取数据了。 首先创建一个关联OSS目录的 database : 现在就可以通过sql写入数据到OSS了,如下:

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包