【spark系列9】spark 的动态分区裁剪上(Dynamic partition pruning)-逻辑计划

本文深入解析Spark 3.0.1中的动态分区裁剪机制,重点在于PartitionPruning.applyPartitionPruning逻辑。当SQLConf动态分区裁剪启用时,针对Join操作,提取等值连接键并检查是否能用于动态裁剪。通过pruningHasBenefit方法评估过滤效果,优化左或右连接表,减少不必要的分区扫描。这一过程涉及到HadoopFsRelation、DynamicPruningSubquery等概念,旨在提高查询效率。

背景

本文基于delta 0.7.0
spark 3.0.1
spark 3.x引入了动态分区裁剪,今天我们分析以下代码是怎么实现的

分析

直接定位到PartitionPruning.applyPartitionPruning是逻辑计划的规则

override def apply(plan: LogicalPlan): LogicalPlan = plan match {
    // Do not rewrite subqueries.
    case s: Subquery if s.correlated => plan
    case _ if !SQLConf.get.dynamicPartitionPruningEnabled => plan
    case _ => prune(plan)
  }
  • 当是该逻辑计划是子查询且该子查询是相关的,则直接跳过,因为相关的子查询将会被重写到join条件中
  • 如果没有开启动态分区,则直接跳过
  • 其他条件则会跳到下一步
    下一步的条件,则是会判断是否是包含join操作,如果是join操作才会进行后续的操作:
private def prune(plan: LogicalPlan): LogicalPlan = {
    plan transformUp {
      // skip this rule if there's already a DPP subquery on the LHS of a join
      case j @ Join(Filter(_: DynamicPruningSubquery, _), _, _, _, _) => j
      case j @ Join(_, Filter(_: DynamicPruningSubquery, _), _, _, _) => j
      case j @ Join(le
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值