Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spark Join 源码剖析①

Spark Join 源码剖析①

作者头像
codingforfun
发布于 2022-05-23 03:06:09
发布于 2022-05-23 03:06:09
8950
举报

一、Join 逻辑计划生成

和 Join 相关的逻辑层的优化规则主要包含以下几种:

ReorderJoin

EliminateOuterJoin

👍🏻DPP 动态分区裁剪

以及

👍🏻PushDownPredicates

中和 Join 相关的 predicate pushDown

二、Join 物理计划生成和选取

2.1、基本概念

Spark SQL 中,参与 Join 操作的两张表分别被称为流式表(StreamTable)和构件表(BuildTable),不同表的角色在 Spark SQL 中会通过一定的策略进行设定。通常来讲,系统会将大表设置为 StreamTable,小表设置为 BuildTable。流式表的迭代器为 streamIter,构建表的迭代器为 buildIter。遍历 streamIter 的每一条记录,然后在 buildIter 中查找匹配的记录。这个查找过程称为 build 过程。每次 build 操作的结果为一条 JoinedRow(A, B),其中 A 来自 streamedIter,B 来自 buildIter。

再例如,在 BroadcastHashJoin 中需要决定广播哪个数据表。这里的 BuildSide 可以简单理解为 “构建的一边”。

在 Spark 中,BuildSide 作为一个抽象类,包含 BuildLeft 和 BuildRight 两个子类,一般在构造 Join 的执行算子时,都会传入一个 BuildSide 的构造参数。在 JoinSelection 中通过 canBuildRightcanBuildLeft 判断一个 Join 类型能否 “构建” 右表和左表。

2.2、物理计划选取顺序

Join 物理执行计划的选取在 JoinSelection 中进行,其主要逻辑如下:

如果是一个等值 join(equi-join)且包含 join hint,我们依次查看 join hint:

  1. broadcast hint:如果 join 类型支持,使用 broadcast hash join。如果 left 和 right 都有 broadcast hint,选择 size 较小的一侧(基于统计数据)进行 broadcast
  2. sort merge hint:如果 join keys 是可排序的,使用 sort merge join。
  3. shuffle hash hint:如果 join 类型支持,如果 left 和 right 都设置了 shuffle hash hints,选择 size 较小的一侧作为 build side
  4. shuffle replicate NL hint:如果 join type 为 inner like,使用 cartesian product join(笛卡尔积)

JoinSelection 通过 ExtractEquiJoinKeys 来判断是否为等值 Join 并提取相关信息:

如果没有指定 hint 或 hint 不适用,Join 选择顺序如下:

  1. 尝试选用 broadcast hash join:如果 join 类型支持,且 join 的一侧 size 足够小能够 broadcast。如果都足够小,选择更小的一侧进行 broadcast(基于统计数据)
  2. 尝试选用 shuffle hash join:如果 join 类型支持,且 join 的一侧 size 足够小能够构建 local hash map,且该侧 size 显著小于另一侧,且 spark.sql.join.preferSortMergeJoin 为 false
  3. 尝试选用 sort merge join:如果 join keys 是可排序的
  4. 尝试选用笛卡尔积:如果是 inner like join
  5. 尝试选用 broadcast nested loop join:最后的兜底手段,可能会 OOM,如果这里 OOM 了,也没办法了

2.3、等值 Join 情况

注①:

createJoinWithoutHint 如下:

2.4、非等值 Join 情况

三、Join 物理计划执行

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python进阶之Matplotlib入门(四)
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
HuangWeiAI
2019/10/31
5680
【数据分析可视化】公式、坐标轴
import numpy as np import matplotlib.pyplot as plt %matplotlib inline 公式 # 公式 plt.title('equals',fontsize=15) plt.xlim([1,8]) plt.ylim([1,5]) plt.text(2,4,r'$ \alpha \beta \pi \lambda \omega $',size=15) plt.text(4,4,r'$ \sin(0)=\cos(\frac{\pi}{2}) $',size
瑞新
2020/07/07
4260
【数据分析可视化】公式、坐标轴
pycharm使用matplotlib绘图学习笔记「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/174663.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
5670
matplotlib的基本用法——调整坐标轴
本文主要是关于matplotlib的一些基本用法。 Demo import matplotlib.pyplot as plt import numpy as np # 绘制普通图像 x = np.linspace(-1, 1, 50) y1 = 2 * x + 1 y2 = x**2 plt.figure() plt.plot(x, y1) plt.plot(x, y2, color = 'red', linewidth = 1.0, linestyle = '--') # 设置坐标轴的取值范围 p
Tyan
2019/05/25
1.5K0
python学习之matplot
import matplotlib.pyplot as plt import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.gridspec as gridspec from matplotlib import animation
py3study
2020/01/08
8270
Python数据分析之matplotlib(应用篇)
matplotlib核心剖析(http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html#commentform)
AI异构
2020/07/29
3630
Python数据分析之matplotlib(应用篇)
Matplotlib使用笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
6070
Matplotlib 系列之「Legend 图例」
Matplotlib 的 Legend 图例就是为了帮助我们展示每个数据对应的图像名称,更好的让读者认识到你的数据结构。
Python技术与生活认知的分享
2018/08/16
1.6K0
Matplotlib 系列之「Legend 图例」
Python数据可视化工具:Matplotlib学习笔记(一)
大家好,我是小雨。 今天要跟大家分享的内容?是关于Python数据可视化方面的内容。Python在数据处理方面真的太厉害了,所以总结了部分笔记,分享给大家一起学习。 简介 matplotlib是什
小雨coding
2021/03/27
1.5K0
Python进阶之Matplotlib入门(五)
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
HuangWeiAI
2019/11/07
7440
Python进阶之Matplotlib入门(五)
Python3快速入门(十六)——Mat
Matplotlib是 Python 2D-绘图领域使用最广泛的套件,可以简易地将数据图形化,并且提供多样化的输出格式。 matplotlib有两个接口,一个是状态机层的接口,通过pyplot模块来进行管理;一个是面向对象的接口,通过pylab模块将所有的功能函数全部导入其单独的命名空间内。
py3study
2020/01/03
1.5K0
数据可视化之matplotlib绘制正余弦曲线图
在python里面,数据可视化是python的一个亮点。在python里面,数据可视可以达到什么样的效果,这当然与我们使用的库有关。python常常需要导入库,并不断调用方法,就很像一条流数据可视化的库,有很多,很多都可以后续开发,然后我们调用。了解过pyecharts美观的可视化界面 ,将pyecharts和matplotlib相对比一下。
兰舟千帆
2022/07/16
1.9K0
数据可视化之matplotlib绘制正余弦曲线图
Matplotlib 系列之「绘制函数图像」
matplotlib 是 python 最著名的绘图库,它提供了一整套和 matlab 相似的命令 API,十分适合交互式进行绘图。
Python技术与生活认知的分享
2018/08/16
1.4K0
Matplotlib 系列之「绘制函数图像」
python matplotlib各种绘图类型完整总结
plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)
Twcat_tree
2022/12/05
6.2K0
python matplotlib各种绘图类型完整总结
python画图[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 前言 因为数据需要用图形来展示。在Excel,matlab,python中,我选择了python。 数学“剑魔”的的时候,我看到有人用Excel生成柱状图之类的,挺好看,但是我不会啊。matlab以前学过一点,但是当前电脑没有这个软件。安装这个软件有些费事。所以干脆选择使用python生成图形。毕竟学习python相较于学习Excel,相对而言,“性价比”高点。🐶 我基本不会python,这是第一篇python。 水水,这浪花可这大~ 我目前仅仅需要柱状
全栈程序员站长
2022/07/01
1.8K0
python画图[通俗易懂]
快速上手matplotlib画图
本文是我在学习莫烦老师视频教程时候整理的笔记。Matplotlib是一个python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,散点图等。
触摸壹缕阳光
2020/04/26
1.5K0
matplotlib 入门使用指南
1. pyplot模块 1.1. color的值 blue 1.2. Marker的值 point marker 1.3. LineStyles的值 solid line style 例子: 'b' # blue markers with default shape 'ro' # red circles 'g-' # green solid line '--' # dashed line with default color 'k^:' # black triangle_up mark
syy
2020/04/07
1K0
Matplotlib可视化指导手册
通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制。一幅数据图基本上包括如下结构:
星星在线
2020/05/22
1.5K0
Matplotlib
Matplotlib 官网 此篇笔记参考来源为《莫烦Python》 安装同之前所述,参考《Python初学基础》 基本使用 2.1 基本用法 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1, 1, 50) #使用np.linspace定义x:范围是(-1,1);个数是50 y = 2*x + 1 plt.figure() #定义一个图像窗口 plt.plot(x, y) plt.show()
闪电gogogo
2018/05/28
1.3K0
Python Matplotlib 画心形曲线[通俗易懂]
本文主要采用matplotlib绘制心形图案,并学习matplotlib中坐标轴的移动,图片背景,刻度字体大小,颜色,背景网格线,图片保存等的操作方法。
全栈程序员站长
2022/11/07
2K0
Python Matplotlib 画心形曲线[通俗易懂]
相关推荐
Python进阶之Matplotlib入门(四)
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档