图文理解 Spark 3.0 的动态分区裁剪优化
本文转载自微信公众号「过往记忆大数据」,作者过往记忆大数据 。转载本文请联系过往记忆大数据公众号。
Spark 3.0 为我们带来了许多令人期待的特性。动态分区裁剪(dynamic partition pruning)就是其中之一。本文将通过图文的形式来带大家理解什么是动态分区裁剪。
Spark 中的静态分区裁剪
在介绍动态分区裁剪之前,有必要对 Spark 中的静态分区裁剪进行介绍。在标准数据库术语中,裁剪意味着优化器将避免读取不包含图文我们正在查找的数据的文件。例如我们有以下的查询 SQL:
Select * from iteblog.Students where subject = 'English';
在这个简单的查询中,我们试图匹配和识别 Students 表中 subject = English 的记录。比较愚蠢的做法是先把数据全部 scan 出来,然后再使用 subject = 'Engli理解sh' 去过滤。如下图所示:
比较好的实现是查询优化器将过滤器下推到数据源,以便能够避免扫描整个数据集,Spark 就是这么来做的,如下图所示:
在静态分区裁剪技术中,我们的表首先是分区的,分区过滤下推的思想和上面的 filter push down 一致。因为在这种情况下,如果我们的查询有一个针对分区列的过滤,那么在实际的查询中可以跳过很多不必要的分区,从而大大减少数据的扫描,减少磁盘I/O,从而提升计算的性能。
然而,在现实中,我们的查 S询语句不会是这么简单的。通常情况下,我们会有多张维表,小表需要与大的事实表进行 join。因此,在这种情况下,我们不能再应用静态分区裁剪,因为 filter 条件在 join 表的一侧,而对裁剪有用的表在 Join 的另一侧。比如我们有以下的查询语句:
Select * from iteblog.Students join iteblog.DailyRoutine  ap;where iteblog.DailyRoutine.subject = 'English';
对于上面的查询,比较垃圾的查询引擎最后的执行计划如下:
它把两张表的数据进行关联,然后再过滤。在数据量比较大的情况下效率可想而知。一些比较好的计算引擎可以进行一些优化,比如:
其能够在一张表里面先过滤一些无用的数据,再进行 Join,效率自然比前面一种好。但是如果是我们人来弄,其实我们可以把rk subject = 'English' 过滤条件下推到 iteblog.Students 表里面,这个正是 Spark 3.0 给我们带来的动态分区裁剪优化。
动态分区裁剪
在 Spark SQL 中,用户通常用他们喜欢的编程语言并选择他们喜欢的 API 来提交查询,这也就是为什么有 DataFrames 和 DataSet。Spark 将这个查询转化为一种易于理解的形式,我们称它为查询的逻辑计划(logical plan)。在此阶段,Spark 通过应用一组 3基于规则(rule based)的转换(如列修剪、常量折叠、算子下推)来优化逻辑计划。然后,它才会进入查询的实际物理计划(physical planning)。在物理规划阶段 Spark 生成一个可执行的计划(executable plan),该计划将计算分布在集群中。本文我将解释如何在逻辑计划阶段实现动态分区修剪。然后,我们将研究如何在物理计划阶段中进一步优化它。
逻辑计划阶段优化
假设我们有一个具有多个分区的事实表(fact tabl.0e),为了方便说明,我们用不同颜色代表不同的分区。另外,我们还有一个比较小的维度表(dimension table),我们的维度表不是分区表。然后我们在这些数据集上进行典型的扫描操作。在我们的例子里面,假设我们只读取维度表里面的两行数据,而这两行数据其实对于另外一张表的两个分区。所以最后执行 Join 操作时,带有分区的事实表只需要读取两个分区的数据就可以。
因此,我们不需要实际扫描整个事实表。为了做到这种优化,一种简单的方法是通过 的维度表构造出一个过滤子查询(比如上面例子为 select subject from iteblog.DailyRoutine where subject = 'English'),然后在扫描事实表之前加上这个过滤子查询。
通过这种方式,我们在逻辑计划阶段就知道事实表需要扫描哪些分区。
但是,上面的物理计划执行起来还是比较低效。因为里面有重复的子查询,我们需要找出一种方法来消除这个重复的子查询。为了做到这一点,Spark 在物理计划阶段做了动态一些优化。
物理计划阶段优化
如果维度表很小,那么 Spark 很可能会以 broadcast hash join 的形式执行这个 Join。Broadcast Hash Join 的实现是将小表的数据广播(broadcast)到 Spark 所有的 Executor 端,这个广播过程和我们自己去广播数据没什么区别,先利用 collect 算子将小表的数据从 Executor 端拉到 Driver 端,然后在 Driver 端调用 sparkContext.broa分区dcast 广播到所有 Executor 端;另一方面,大表也会构建 hash table(称为 build relation),之后在 Executor 端这个广播出去的数据会和大表的对应的分区进行 Join 操作,这种 Join 策略避免了 Shuffle 操作。具体如下:
我们已经知道了 broadcast hash join 实现原理。其实动态分区裁剪优化就是在 broadcast hash join 中大表进行 build relation 的时候拿到维度表的裁剪广播结果(broadcast results),然后在 build relation 的时候(Scan 前)进行动态过滤,从而达到避免扫描无用的数据效果。具体如下:
好了,以上就是动态分区裁剪在逻辑计划和物理计划的优化。
动态分区裁剪适用条件
并不是什么查询都会启用动态裁剪优化的,必须满足以下几个条件:
spark.sql.optimizer.dynamicPartitionPruning.enabled 参数必须设置为 true,不过这个值默优化认就是启用的; 需要裁减的表必须是分区表,而且分区字段必须在 join 的 on 条件里面; Join 类型必须是 INNER, LEFT SEMI (左表是分区表), LEFT OUTER (右表是分区表), or RIGHT OUTER (左表是分区表)。 满足上面的条件也不一定会触发动态分区裁减,还必须满足 spark.sql.optimizer.dynamicPartitionPruning.useStats 和 spark.sql.optimizer.图文dynamicPartitionPruning.fallbackFilterRatio 两个参数综合评估出一个进行动态分区裁减是否有益的值,满足了才会进行动态分区裁减。评估函数实现请参见 org.apache.spark.sql.dynamicpruning.PartitionPruning#pruningHasBenefit。
本文主要翻译自:https://blog.knoldus.com/dynamic-partit理解ion-pruning-in-spark-3-0/
(责任编辑:开箱测评)
-
云梦级2月13日云梦级消息,2月13日,智元机器人正式发布全新一代全尺寸人形机器人远征A3。以“绝世高手”为主题首次亮相,远征A3在充满新春元素的练功房里接连完成凌空飞踹、连续飞踢、空中漫步、摸地旋风...[详细]
-
Hello,大家早上好,又是元气满满的一天,先来浏览新鲜的早报吧~ 【华为 2025 全球销售收入 8809 亿元】 华为 2025 年全球销售收入 8809 亿元,净利润 680 亿元,研发投入高达...[详细]
-
标签: REDMI K90 Note15 WPS Mate90 麒麟芯片
Hello,大家早上好,又是元气满满的一天,先来浏览新鲜的早报吧~ 【REDMI 部分产品官方调价】 小米 REDMI 部分产品迎来官方调价。其中,K90 标准版涨价 200 元、Note 15 系列...[详细]
-
Facebook曾主动提议帮助打造新的社交网络以规避反垄断指控
北京时间12月23日凌晨消息,据消息人士透露,在美国联邦和各州政府的调查人员本月向联邦法院提出针对Facebook的全面反垄断指控之前,该公司律师曾向调查人员称其可以采取措施来促进竞争。 消息称,Fa...[详细]
-
近日,谷歌宣布将在南 卡罗来纳州进行一项高达90亿美元的投资,以扩展其数据中心的建设。这项投资不仅显示出谷歌对人工智能基础设施日益增长的需求的响应,同时也标志着南 卡罗来纳州在数字经济领域的转型。 谷...[详细]
-
标签: 谷歌 Nano Banana Pro Gemini AI图像生成
云梦级11月21日云梦级消息,谷歌今日正式推出了全新图像生成与编辑模型 Nano Banana Pro (Gemini 3 Pro Image)。该模型基于 Gemini 3 Pro 架构构建,号称能...[详细]
-
12月11日消息,外媒日前报道,马斯克旗下太空探索技术公司SpaceX计划在明年中后期上市,并寻求以约1.5万亿美元的估值筹集300亿美元资金。马斯克在社交媒体上证实了SpaceX正寻求上市。 图片来...[详细]
-
云梦级2月1日云梦级消息,据“惠州清风”微信公众号云梦级消息,1月29日,康佳集团股份有限公司原党委书记、董事局副主席周彬涉嫌严重违纪违法,目前正接受中央纪委国家监委驻华润集团纪检监察组纪律审查和惠州...[详细]
-
11月12日消息,截至11月11日23:59,“晚8点不熬夜”的京东11.11累计下单金额创造了新的纪录。在这背后,京东云作为京东11.11坚实的技术基石,京东11.11当天前10分钟,每秒用户访问峰...[详细]
-
本文档描述了 Docker Engine 中普遍可用的 Docker Engine 网络驱动程序插件。要查看 Docker Engine 管理的插件信息,请参阅Docker Engine 插件系统。...[详细]
- https://www.theaerogroup.net/?cat=28&s=谷歌搜索留痕霸屏【tg:seogoogle987】,NeB
- https://www.nissin.com/jp/search/?cat=105&q=谷歌搜索留痕霸屏【tg:seogoogle987】,Q9U
- https://www.localfootdoc.com/?s=谷歌搜索留痕霸屏【tg:seogoogle987】,zMV
- https://search.danawa.com/dsearch.php?query=谷歌搜索留痕霸屏【tg:seogoogle987】78d
- https://www.temu.com/search_result.html?search_key=谷歌搜索留痕霸屏【tg:seogoogle987】a17
- https://www.tullygroup.us/?ID=hbkq8jFjrQlVRrwzEmvoUJJAY4e1Lfo5&s=谷歌搜索留痕霸屏【tg:seogoogle987】,y6p
- https://www.tcv.org.uk/search/谷歌搜索留痕霸屏【tg:seogoogle987】,lL1
- https://www.ncetm.org.uk/search?action=CHECK&q=谷歌搜索留痕霸屏【tg:seogoogle987】,IIx
- https://www.xvideos.com/tags/谷歌搜索留痕霸屏【tg:seogoogle987】,TV0
- https://www.urmc.rochester.edu/news/search?q=谷歌搜索留痕霸屏【tg:seogoogle987】,XGP

苹果推出 STARFlow:全新 AI 图像生成技术想力压 DALL-E 与 Midjourney
华为彭松:协同运力、算力、存力,加速迈向智能世界
Kubernetes Node规模突破7500
字节跳动 AI 编程工具 Trae 下架 Claude 模型,Pro 会员获补偿
2025年三季度AI应用市场现状:移动端用户突破 7 亿,豆包夺原生AI APP月活第一
