Spark三种常见JOIN方式

2023-05-16

Spark join 基本原理

Spark join的基本实现流程如下图所示,Spark将参与Join的两张表抽象为流式表(StreamTable)和查找表(BuildTable),通常系统会默认设置StreamTable为大表,BuildTable为小表。流式表的迭代器为streamItr,查找表迭代器为BuidIter。Join操作就是遍历streamIter中每条记录,然后从buildIter中查找相匹配的记录。

 

SortMergeJoin

SortMergeJoin是spark默认的join方式。

步骤:

  1. 对两张表分别进行shuffle重分区,之后将相同key的记录分到对应分区,每个分区内的数据在join之前都要进行排序,这一步对应Exchange节点和sort节点。也就是spark 的sort merge shuffle过程。

  2. 遍历流式表,对每条记录都采用顺序查找的方式从查找表中搜索,每遇到一条相同的key就进行join关联。每次处理完一条记录,只需从上一次结束的位置开始继续查找。

BroadcastJoin

BroadcastJoin也叫map join,适用于存在小表的情况。其将小表进行广播,避免shuffle的产生。web ui的sql图可以看到driver collect的时间,build建表压缩时间,broadcast广播时间。需要注意的是:在Outer类型的Join中,基表不能被广播,比如A left outer join B时,只能广播右表B。

触发场景:

  • 被广播表小于参数 spark.sql.autoBroadcastJoinThreshold``=``20971520,默认10MB。

  • 在SQL中显示添加Hint(MAPJOIN、BROADCASTJOIN或BROADCAST),比如想广播a表,就在select后加上/*+MAPJOIN(a)*/。

ShuffledHashJoin

ShuffledHashJoin避免将小表分发到各个executor上,可以减少driver和executor端的压力。

步骤:

  1. 对两张表分别进行shuffle重分区,将相同key的记录分到对应分区中,这一步对应Exchange节点

  2. 将查找表分区构造一个HashMap,然后在流式表中一行行对应查找。

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

  1. 查找表总体估计大小超过spark.sql.autoBroadcastJoinThreshold设定的值,即不满足BroadcastJoin 条件

  2. 关闭优先使用SortMergeJoin开关,spark.sql.join.preferSortMergeJoin=false

  3. 每个分区的平均大小不超过spark.sql.autoBroadcastJoinThreshold设定的值,查找表数据量 < 广播数据阈值 * shuffle的partition数。

  4. streamIter的大小是buildIter三倍以上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark三种常见JOIN方式 的相关文章

  • LINQ 中的多个左联接

    我正在尝试将 SQL 查询转换为 LINQ 但无法正确获取语法 我原来的 工作的 SQL 查询是 SELECT a PersonnelNumber a LastName a FirstName a MiddleInitial b Title
  • mysql从具有不同键的同一列进行多个连接

    我需要一些帮助来与下表进行第二次连接 我之前从这里得到了一些帮助 建议我需要添加第二个 JOIN 但是 这就是我陷入困境并需要一些帮助的地方 wp posts id Post Title 01 Event 1 02 Event 2 wp 后
  • Oracle 数字和 varchar 连接

    我有一个连接两个表的查询 一个表的列类型为 varchar 另一表的列类型为 number 我已经在 3 个 Oracle 数据库上执行了查询 并且看到了一些奇怪的结果 希望能够得到解释 在其中两个数据库上 类似以下内容的工作 select
  • 使用连接、分组依据和聚合函数的 SQL 选择查询

    我有两个带有以下字段的表 emp table emp id emp name salary increase emp id inc date inc amount 我需要编写一个查询 其中提供员工详细信息 员工加薪的次数 最大加薪金额以及加
  • FROM 子句中的 PostgreSQL json_array_elements - 为什么这不是笛卡尔连接?

    如果我有这样的表达 SELECT t json column gt gt x nested gt gt y FROM my table t json array elements t gt nested nested 为什么我不需要加入 更
  • Rails :include 与 :joins

    这更多的是一个 为什么事情会这样运作 的问题 而不是一个 我不知道该怎么做 的问题 因此 提取您知道将要使用的关联记录的福音是使用 include因为您将获得连接并避免一大堆额外的查询 Post all include gt comment
  • postgresql自连接

    假设我有一张这样的桌子 id device cmd value id unique row ID device device identifier mac address cmd some arbitrary command value v
  • 为什么Mysql在连接另一个表B时对表A使用全表扫描?

    我有一个表 A 和一个表 B 我正在从表 A 中选择信息 其中我只需要表 A 中的信息 其中表 B 联接表 A 我在联合列和 WHERE 子句上有索引 这是选择代码 SELECT FROM tableA INNER JOIN tableB
  • 如何将 SELECT...INTO 与 JOIN 一起使用?

    我有以下示例代码 DECLARE myRow table rowtype myVar table2 column type BEGIN SELECT table col1 table col3 table col4 table2 colum
  • 将内部联接和 where 子句添加到 INSERT INTO ON DUPLICATE KEY UPDATE

    我从 INSERT INTO ON DUPLICATE KEY UPDATE MySQL 语句开始 INSERT INTO Table1 field1 field2 VALUES 1 2 ON DUPLICATE KEY UPDATE fi
  • MS Access 不支持连接表达式吗?

    谁能向我解释我的查询有什么问题吗 SELECT T2 TIPOPRODUTO T2 PRODUTO T1 ESPESSURA AS LARGURA AS COMPRIMENTO AS ACABAM REVEST AS ESPECIF QUA
  • PostgreSQL 中的 LATERAL JOIN 和子查询有什么区别?

    自从 PostgreSQL 推出以来 它具备了以下功能 LATERAL连接 我一直在阅读它 因为我目前为我的团队进行复杂的数据转储 其中有许多低效的子查询 使整个查询需要四分钟或更长时间 我明白那个LATERALjoins 可能可以帮助我
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • 动态/条件 SQL 连接?

    我在 MSSQL 表 TableB 中有数据 其中 dbo tableB myColumn 在特定日期后更改格式 我正在做一个简单的连接到该表 Select dbo tableB theColumnINeed from dbo tableA
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • 在 PowerShell 中,将两个表合并为一个表的最佳方法是什么?

    我对 PowerShell 相当陌生 想知道是否有人知道解决以下示例问题的更好方法 我有一组从 IP 地址到主机名的映射 这表示活动 DHCP 租约的列表 PS H gt leases IP Name 192 168 1 1 Apple 1
  • SQL中如何合并多个表的数据

    我想我的处境很复杂 这是场景 我在 SQL Server 中有 3 个表 注册 学生 课程 仅供参考 没有外键 表的列是 Student 学生号 学生名 Course 课程 ID 课程名称 注册 注册 ID 学生 ID 课程 ID 课程结果
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • sql join 告诉我 ID 是否存在于其他表中

    我有 2 张桌子 A B ID FKID 1 3 2 3 3 4 4 4 我需要一个 select 语句 它显示 A 的所有内容 其中一个字段告诉我表 B 是否有任何与该 ID 匹配的 id Desired Result ID hasB 1

随机推荐

  • 【Python基础】之装饰器

    这是我初次接触装饰器 xff0c 先从初学者的角度介绍装饰器 xff0c 关于装饰器的应用场景举例 xff0c 后面再补充 1 装饰器的作用 装饰器可以让一个函数在不做任何变动的情况下新增额外的功能 如下代码 xff0c func name
  • Sonic simple服务中设备图片、测试用例运行异常图片、失败录像路径映射配置

    使用docker ps查看容器信息 使用docker exec it a2d69c075875 sh进入容器 xff0c 并查看容器文件 相关文件夹说明 xff1a imageFiles xff1a 测试用例运行截图信息 keepFiles
  • ubuntu vmware 虚拟网络编辑 ping 外网不通问题

    内网环境在192 168 1 1 网段 虚拟机想要ssh 接入 xff0c 并且可以上网 使用桥接方式和NAT方式都可以 互ping xff0c 但是上网遇到了问题 NAT解决方法如下 xff0c 桥接方式随后再研究 NAT 模式下子网IP
  • 深入解读相机矩阵

    在这片文章里 xff0c 你将了解到以下内容 xff1a 1 相机的针孔模型 2 相机矩阵的概念 3 相机内参的含义 4 相机外参的含义 1 相机针孔模型 针孔模型是相机成像的基础模型 xff0c 是理解后续相机矩阵内容的基础 下图描述了基
  • python 循环输入,用户输入回车结束

    输入的回车会被视为空字符 xff0c 可以用a 61 61 39 39 来作为结束循环的标志 n 61 while 1 a 61 input if a 61 61 39 39 break else n append a print n
  • OpenvSwitch 子项目 OVN 功能介绍(一)

    众所周知 xff0c OpenvSwitch 以其丰富的功能和不错的性能 xff0c 已经成为 Openstack 部署中最受欢迎的虚拟交换机 由于 Openstack Neutron 的架构引入了一些性能问题 xff0c 比如 neutr
  • SDN网络中的转发数据和数据传输

    数据驱动的网络 从数据驱动的角度来看网络 xff0c 会发现一张现实中的网络存在着各种数据 设计和管理一张网络 xff0c 主要是设计数据 xff0c 存储数据 xff0c 管理数据和分析数据 网络数据的规模 复杂度和变化速度 xff0c
  • [云计算]OpenStack - Neutron

    Neutron在OpenStack中的位置 可以为虚拟机或者 OpenStack 组件提供网络服务 xff0c xff08 由 Nova network 独立出来的 xff09 随着需承载业务的能力的增长作为 Nova 子组件无法满足 过程
  • 后台架构师除了技术,还有97件事,你知道吗?

    对于架构师 xff0c 很多人可能觉得很笼统 架构师到底需要学习什么 xff1f 学习完哪些技术就可以到架构师的水准 在行业内的话其实并没有一个非常明确的标准 技术是一方面 xff0c 但是如果仅仅只是技术的话 xff0c 具体一名合格的架
  • Failed to read artifact descriptor for xxx.jar

    mavne 项目 pom xml 文件标红 错误如下 xff1a Failed to read artifact descriptor for xxx jar Failed to read artifact descriptor for x
  • imx6q平台上移植mt7601

    本文描述如何将MT7601 WiFi模块移植到IMX6Q开发板上 xff0c 分析移植过程中碰到的问题 xff0c 分析错误原因 xff0c 提供解决办法 一 MT7601实物图 二 验证开发板和USB MT7601硬件是否正常 步骤1 x
  • 在图片上画出标注目标框和类别python程序

    在图片上画出标注目标框和类别python程序 xff0c 还是比较简单的 xff0c 直接上一份代码 xff1a usr bin python coding UTF 8 2018 07 11 by DQ import cv2 import
  • iOS性能监控及自动化测试辅助工具对比-tidevice、py-ios-device(pyidevice)、sonic-ios-bridge(sib)

    对比项 tidevice py ios device xff08 pyidevice xff09 sonic ios bridge xff08 sib xff09 是否开源 github地址 https github com alibaba
  • git中tag与release的创建以及两者的区别

    简介 本文辨析在参与开源项目时会遇到的tag与release的概念区别与联系 xff0c 并比较两者的创建方法 定义 标签 xff08 tag xff09 是特定提交 xff08 commit 一个指针 xff0c 也就是每个tag对应一个
  • 如何评价数仓好坏

    评价一个数仓的好坏可以涉及相当多的维度 xff0c 这里简单分享一些在实习时了解到的比较看重的方面 模型合理性 一个数仓模型的诞生往往是为了满足产品提出来的业务需求 xff0c 但是如果一个模型仅仅只能做到完全为这一次需求而服务的话 xff
  • 数据倾斜的判断方法和解决方案

    数据倾斜的判断方法 首先点开任务的sparkUI界面中的Stages xff0c 对Duration一列进行排序 xff0c 观察看有没有某个stage出现运行时间远大于其它stage的情况出现 xff0c 假设有的话 xff0c 就点开D
  • 数据开发中的资源管理优化(spark运行)

    在数据开发中 xff0c 资源管理主要看关注于队列整体的CPU使用率 xff0c 内存使用率或者单个任务的CPU使用率 xff0c 内存使用率 CPU使用率 默认情况下是一个core执行一个task 如果此时CPU利用率过低 xff0c 那
  • 互联网大厂SQL真题(二)

    题目 xff1a 每天的日活数及新用户占比 新用户占比 61 当天的新用户数 当天活跃用户数 xff08 日活数 xff09 如果in time 进入时间和out time 离开时间跨天了 xff0c 在两天里都记为该用户活跃过 新用户占比
  • 互联网大厂SQL真题(三)

    题目 xff1a 近一个月发布的视频中热度最高的top3视频 问题 xff1a 找出近一个月发布的视频中热度最高的top3视频 注 xff1a 热度 61 a 视频完播率 43 b 点赞数 43 c 评论数 43 d 转发数 新鲜度 xff
  • Spark三种常见JOIN方式

    Spark join 基本原理 Spark join的基本实现流程如下图所示 xff0c Spark将参与Join的两张表抽象为流式表 StreamTable 和查找表 BuildTable xff0c 通常系统会默认设置StreamTab