返回顶部
首页 > 资讯 > 数据库 >Spark SQL的Join实现方法有哪些
  • 674
分享到

Spark SQL的Join实现方法有哪些

2024-04-02 19:04:59 674人浏览 安东尼
摘要

本篇内容主要讲解“spark sql的Join实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spark SQL的Join实现方法有哪些”吧!Spa

本篇内容主要讲解“spark sql的Join实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spark SQL的Join实现方法有哪些”吧!

SparkSQL总体流程介绍

在阐述Join实现之前,我们首先简单介绍SparkSQL的总体流程,一般地,我们有两种方式使用SparkSQL,一种是直接写sql语句,这个需要有元数据库支持,例如Hive等,另一种是通过Dataset/DataFrame编写Spark应用程序。如下图所示,sql语句被语法解析(SQL AST)成查询计划,或者我们通过Dataset/DataFrame提供的apis组织成查询计划,查询计划分为两大类:逻辑计划和物理计划,这个阶段通常叫做逻辑计划,经过语法分析(Analyzer)、一系列查询优化(Optimizer)后得到优化后的逻辑计划,最后被映射成物理计划,转换成RDD执行。

Spark SQL的Join实现方法有哪些

Join基本要素

如下图所示,Join大致包括三个要素:Join方式、Join条件以及过滤条件。其中过滤条件也可以通过AND语句放在Join条件中。

Spark SQL的Join实现方法有哪些

Spark支持所有类型的Join,包括:

  •  inner join

  •  left outer join

  •  right outer join

  •  full outer join

  •  left semi join

  •  left anti join

下面分别阐述这几种Join的实现。

Join基本实现流程

总体上来说,Join的基本实现流程如下图所示,Spark将参与Join的两张表抽象为流式遍历表(streamIter)和查找表(buildIter),通常streamIter为大表,buildIter为小表,我们不用担心哪个表为streamIter,哪个表为buildIter,这个spark会根据join语句自动帮我们完成。

Spark SQL的Join实现方法有哪些

在实际计算时,spark会基于streamIter来遍历,每次取出streamIter中的一条记录rowA,根据Join条件计算keyA,然后根据该keyA去buildIter中查找所有满足Join条件(keyB==keyA)的记录rowBs,并将rowBs中每条记录分别与rowAjoin得到join后的记录,最后根据过滤条件得到最终join的记录。

从上述计算过程中不难发现,对于每条来自streamIter的记录,都要去buildIter中查找匹配的记录,所以buildIter一定要是查找性能较优的数据结构。spark提供了三种join实现:sort merge join、broadcast join以及hash join。

sort merge join实现

要让两条记录能join到一起,首先需要将具有相同key的记录在同一个分区,所以通常来说,需要做一次shuffle,map阶段根据join条件确定每条记录的key,基于该key做shuffle write,将可能join到一起的记录分到同一个分区中,这样在shuffle read阶段就可以将两个表中具有相同key的记录拉到同一个分区处理。前面我们也提到,对于buildIter一定要是查找性能较优的数据结构,通常我们能想到hash表,但是对于一张较大的表来说,不可能将所有记录全部放到hash表中,另外也可以对buildIter先排序,查找时按顺序查找,查找代价也是可以接受的,我们知道,spark shuffle阶段天然就支持排序,这个是非常好实现的,下面是sort merge join示意图。

Spark SQL的Join实现方法有哪些

在shuffle read阶段,分别对streamIter和buildIter进行merge sort,在遍历streamIter时,对于每条记录,都采用顺序查找的方式从buildIter查找对应的记录,由于两个表都是排序的,每次处理完streamIter的一条记录后,对于streamIter的下一条记录,只需从buildIter中上一次查找结束的位置开始查找,所以说每次在buildIter中查找不必重头开始,整体上来说,查找性能还是较优的。

broadcast join实现

为了能具有相同key的记录分到同一个分区,我们通常是做shuffle,那么如果buildIter是一个非常小的表,那么其实就没有必要大动干戈做shuffle了,直接将buildIter广播到每个计算节点,然后将buildIter放到hash表中,如下图所示。

Spark SQL的Join实现方法有哪些

从上图可以看到,不用做shuffle,可以直接在一个map中完成,通常这种join也称之为map join。那么问题来了,什么时候会用broadcast join实现呢?这个不用我们担心,spark sql自动帮我们完成,当buildIter的估计大小不超过参数spark.sql.autoBroadcastJoinThreshold设定的值(默认10M),那么就会自动采用broadcast join,否则采用sort merge join。

hash join实现

除了上面两种join实现方式外,spark还提供了hash join实现方式,在shuffle read阶段不对记录排序,反正来自两格表的具有相同key的记录会在同一个分区,只是在分区内不排序,将来自buildIter的记录放到hash表中,以便查找,如下图所示。

Spark SQL的Join实现方法有哪些

不难发现,要将来自buildIter的记录放到hash表中,那么每个分区来自buildIter的记录不能太大,否则就存不下,默认情况下hash join的实现是关闭状态,如果要使用hash join,必须满足以下四个条件:

  •  buildIter总体估计大小超过spark.sql.autoBroadcastJoinThreshold设定的值,即不满足broadcast join条件

  •  开启尝试使用hash join的开关,spark.sql.join.preferSortMergeJoin=false

  •  每个分区的平均大小不超过spark.sql.autoBroadcastJoinThreshold设定的值,即shuffle read阶段每个分区来自buildIter的记录要能放到内存中

  •  streamIter的大小是buildIter三倍以上

所以说,使用hash join的条件其实是很苛刻的,在大多数实际场景中,即使能使用hash join,但是使用sort merge join也不会比hash join差很多,所以尽量使用hash

下面我们分别阐述不同Join方式的实现流程。

inner join

inner join是一定要找到左右表中满足join条件的记录,我们在写sql语句或者使用DataFrame时,可以不用关心哪个是左表,哪个是右表,在spark sql查询优化阶段,spark会自动将大表设为左表,即streamIter,将小表设为右表,即buildIter。这样对小表的查找相对更优。其基本实现流程如下图所示,在查找阶段,如果右表不存在满足join条件的记录,则跳过。

Spark SQL的Join实现方法有哪些

left outer join

left outer join是以左表为准,在右表中查找匹配的记录,如果查找失败,则返回一个所有字段都为null的记录。我们在写sql语句或者使用DataFrmae时,一般让大表在左边,小表在右边。其基本实现流程如下图所示。

Spark SQL的Join实现方法有哪些

right outer join

right outer join是以右表为准,在左表中查找匹配的记录,如果查找失败,则返回一个所有字段都为null的记录。所以说,右表是streamIter,左表是buildIter,我们在写sql语句或者使用DataFrame时,一般让大表在右边,小表在左边。其基本实现流程如下图所示。

Spark SQL的Join实现方法有哪些

full outer join

full outer join相对来说要复杂一点,总体上来看既要做left outer join,又要做right outer join,但是又不能简单地先left outer join,再right outer join,最后uNIOn得到最终结果,因为这样最终结果中就存在两份inner join的结果了。因为既然完成left outer join又要完成right outer join,所以full outer join仅采用sort merge join实现,左边和右表既要作为streamIter,又要作为buildIter,其基本实现流程如下图所示。

Spark SQL的Join实现方法有哪些

由于左表和右表已经排好序,首先分别顺序取出左表和右表中的一条记录,比较key,如果key相等,则joinrowA和rowB,并将rowA和rowB分别更新到左表和右表的下一条记录;如果keyA<keyB,则说明右表中没有与左表rowA对应的记录,那么joinrowA与nullRow,紧接着,rowA更新到左表的下一条记录;如果keyA>keyB,则说明左表中没有与右表rowB对应的记录,那么joinnullRow与rowB,紧接着,rowB更新到右表的下一条记录。如此循环遍历直到左表和右表的记录全部处理完。

left semi join

left semi join是以左表为准,在右表中查找匹配的记录,如果查找成功,则仅返回左边的记录,否则返回null,其基本实现流程如下图所示。

Spark SQL的Join实现方法有哪些

left anti join

left anti join与left semi join相反,是以左表为准,在右表中查找匹配的记录,如果查找成功,则返回null,否则仅返回左边的记录,其基本实现流程如下图所示。

Spark SQL的Join实现方法有哪些

总结

Join是数据库查询中一个非常重要的语法特性,在数据库领域可以说是“得join者得天下”,SparkSQL作为一种分布式数据仓库系统,给我们提供了全面的join支持,并在内部实现上无声无息地做了很多优化,了解join的实现将有助于我们更深刻的了解我们的应用程序的运行轨迹。

到此,相信大家对“Spark SQL的Join实现方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: Spark SQL的Join实现方法有哪些

本文链接: https://lsjlt.com/news/62028.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spark SQL的Join实现方法有哪些
    本篇内容主要讲解“Spark SQL的Join实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spark SQL的Join实现方法有哪些”吧!Spa...
    99+
    2024-04-02
  • Spark SQL的用途有哪些
    Spark SQL是一个用于在Spark平台上进行结构化数据处理的模块,它具有以下用途: 查询和分析结构化数据:Spark SQ...
    99+
    2024-04-09
    Spark
  • sql语句中join的用法有哪些
    在SQL中,JOIN用于将两个或多个表中的行基于其关联列的值组合在一起。以下是常见的JOIN类型:1. 内连接(INNER JOIN...
    99+
    2023-08-08
    sql join
  • spark sql在scala中使用的方式有哪些
    这篇文章主要介绍“spark sql在scala中使用的方式有哪些”,在日常操作中,相信很多人在spark sql在scala中使用的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spark sql...
    99+
    2023-06-02
  • spark读取本地文件的方法有哪些
    在Spark中,可以使用以下几种方式来读取本地文件: 使用sc.textFile()方法读取文本文件: from pyspark...
    99+
    2024-04-02
  • Tk.mybatis零sql语句实现动态sql查询的方法有哪些
    这篇文章主要讲解了“Tk.mybatis零sql语句实现动态sql查询的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Tk.mybatis零sql语句实现动态sql查询的方法有哪些...
    99+
    2023-06-21
  • Hive中Join方式有哪些
    这篇文章主要为大家展示了“Hive中Join方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hive中Join方式有哪些”这篇文章吧。Common/Shuffle/Reduce Join...
    99+
    2023-06-03
  • springboot集成spark并使用spark-sql的方法
    这篇文章主要介绍“springboot集成spark并使用spark-sql的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot集成spark并使用spark-sql的方法”文章...
    99+
    2023-06-29
  • sql join on的使用方法
    这篇文章主要介绍“sql join on的使用方法”,在日常操作中,相信很多人在sql join on的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sql join...
    99+
    2024-04-02
  • spark提交任务的方式有哪些
    通过spark-submit命令行工具提交任务,可以指定参数和配置信息。 通过Spark的编程API编写一个应用程序,然后通过sp...
    99+
    2024-04-03
    spark
  • 防止SQL注入的实现方式有哪些
    今天就跟大家聊聊有关防止SQL注入的实现方式有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、SQL注入简介SQL注入是比较常见的网络攻击方式...
    99+
    2024-04-02
  • sql有哪些优化方法
    小编给大家分享一下sql有哪些优化方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.对查询进行优化,应尽量避免全表扫描,首先...
    99+
    2024-04-02
  • SQL查询方法有哪些
    SQL查询方法有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 简单查询   简单的Transact-SQL查询只包括选择列表、FRO...
    99+
    2024-04-02
  • 有哪些SQL优化方法
    这篇文章主要介绍“有哪些SQL优化方法”,在日常操作中,相信很多人在有哪些SQL优化方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些SQL优化方法”的疑惑有所帮助!接...
    99+
    2024-04-02
  • SQL优化方法有哪些
    这篇文章主要讲解了“SQL优化方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL优化方法有哪些”吧!一、避免进行null判断 &nbs...
    99+
    2024-04-02
  • SQL去重方法有哪些
    这篇文章给大家分享的是有关SQL去重方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。在 MySQL 中...
    99+
    2023-06-22
  • C#实现Eval的方法有哪些
    小编给大家分享一下C#实现Eval的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、背景假如给定一个字符串表达式"-12 * ( - 2.2...
    99+
    2023-06-14
  • clickhouse sql优化的方法有哪些
    点击豪斯(ClickHouse)是一个列式存储的数据库管理系统,专门用于大规模分布式数据处理。以下是一些ClickHouse SQL...
    99+
    2023-10-23
    clickhouse sql
  • SQL Server分页的方法有哪些
    这篇文章主要介绍了SQL Server分页的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL Server分页的方法有哪些文章都会有所收获,下面我们一起来看看吧。方法一:(最常...
    99+
    2023-06-30
  • php sql注入的方法有哪些
    SQL注入是一种常见的网络安全漏洞,攻击者利用此漏洞可以执行恶意SQL语句,从而获取敏感数据或者对数据库进行修改。以下是一些常见的P...
    99+
    2023-08-23
    php sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作