Spark SQL(6) OptimizedPlan

Spark SQL(6) OptimizedPlanSpark SQL(6) OptimizedPlan 在这一步spark sql主要应用一些规则,优化生成的Resolved Plan,这一步涉及到的有Optimizer。 之前介绍在sparkse…

	Spark SQL(6) OptimizedPlan[数据库教程]

Spark SQL(6) OptimizedPlan

在这一步spark sql主要应用一些规则,优化生成的Resolved Plan,这一步涉及到的有Optimizer。

之前介绍在sparksession实例化的是会实例化sessionState,进而确定QueryExecution、Analyzer,Optimizer也是在这一步确定的:

  protected def optimizer: Optimizer = {
    new SparkOptimizer(catalog, experimentalMethods) {
      override def extendedOperatorOptimizationRules: Seq[Rule[LogicalPlan]] =
        super.extendedOperatorOptimizationRules ++ customOperatorOptimizationRules
    }
  }

代码100分

  Optimizer也是RuleExecutor的子类,而SparkOptimizer是Optimizer子类,在analyzed步骤知道,其实主要规则就是RuleExecutor子类定义的batchs的规则

sparkOptimizer:

代码100分 override def batches: Seq[Batch] = (preOptimizationBatches ++ super.batches :+
    Batch("Optimize Metadata Only Query", Once, OptimizeMetadataOnlyQuery(catalog)) :+
    Batch("Extract Python UDF from Aggregate", Once, ExtractPythonUDFFromAggregate) :+
    Batch("Prune File Source Table Partitions", Once, PruneFileSourcePartitions) :+
    Batch("Push down operators to data source scan", Once, PushDownOperatorsToDataSource)) ++
    postHocOptimizationBatches :+
    Batch("User Provided Optimizers", fixedPoint, experimentalMethods.extraOptimizations: _*)

Optimizer:

def batches: Seq[Batch] = {
    val operatorOptimizationRuleSet =
      Seq(
        // Operator push down
        PushProjectionThroughUnion,
        ReorderJoin,
        EliminateOuterJoin,
        PushPredicateThroughJoin,
        PushDownPredicate,
        LimitPushDown,
        ColumnPruning,
        InferFiltersFromConstraints,
        // Operator combine
        CollapseRepartition,
        CollapseProject,
        CollapseWindow,
        CombineFilters,
        CombineLimits,
        CombineUnions,
        // Constant folding and strength reduction
        NullPropagation,
        ConstantPropagation,
        FoldablePropagation,
        OptimizeIn,
        ConstantFolding,
        ReorderAssociativeOperator,
        LikeSimplification,
        BooleanSimplification,
        SimplifyConditionals,
        RemoveDispensableExpressions,
        SimplifyBinaryComparison,
        PruneFilters,
        EliminateSorts,
        SimplifyCasts,
        SimplifyCaseConversionExpressions,
        RewriteCorrelatedScalarSubquery,
        EliminateSerialization,
        RemoveRedundantAliases,
        RemoveRedundantProject,
        SimplifyCreateStructOps,
        SimplifyCreateArrayOps,
        SimplifyCreateMapOps,
        CombineConcats) ++
        extendedOperatorOptimizationRules

    val operatorOptimizationBatch: Seq[Batch] = {
      val rulesWithoutInferFiltersFromConstraints =
        operatorOptimizationRuleSet.filterNot(_ == InferFiltersFromConstraints)
      Batch("Operator Optimization before Inferring Filters", fixedPoint,
        rulesWithoutInferFiltersFromConstraints: _*) ::
      Batch("Infer Filters", Once,
        InferFiltersFromConstraints) ::
      Batch("Operator Optimization after Inferring Filters", fixedPoint,
        rulesWithoutInferFiltersFromConstraints: _*) :: Nil
    }

    (Batch("Eliminate Distinct", Once, EliminateDistinct) ::
    // Technically some of the rules in Finish Analysis are not optimizer rules and belong more
    // in the analyzer, because they are needed for correctness (e.g. ComputeCurrentTime).
    // However, because we also use the analyzer to canonicalized queries (for view definition),
    // we do not eliminate subqueries or compute current time in the analyzer.
    Batch("Finish Analysis", Once,
      EliminateSubqueryAliases,
      EliminateView,
      ReplaceExpressions,
      ComputeCurrentTime,
      GetCurrentDatabase(sessionCatalog),
      RewriteDistinctAggregates,
      ReplaceDeduplicateWithAggregate) ::
    //////////////////////////////////////////////////////////////////////////////////////////
    // Optimizer rules start here
    //////////////////////////////////////////////////////////////////////////////////////////
    // - Do the first call of CombineUnions before starting the major Optimizer rules,
    //   since it can reduce the number of iteration and the other rules could add/move
    //   extra operators between two adjacent Union operators.
    // - Call CombineUnions again in Batch("Operator Optimizations"),
    //   since the other rules might make two separate Unions operators adjacent.
    Batch("Union", Once,
      CombineUnions) ::
    Batch("Pullup Correlated Expressions", Once,
      PullupCorrelatedPredicates) ::
    Batch("Subquery", Once,
      OptimizeSubqueries) ::
    Batch("Replace Operators", fixedPoint,
      ReplaceIntersectWithSemiJoin,
      ReplaceExceptWithFilter,
      ReplaceExceptWithAntiJoin,
      ReplaceDistinctWithAggregate) ::
    Batch("Aggregate", fixedPoint,
      RemoveLiteralFromGroupExpressions,
      RemoveRepetitionFromGroupExpressions) :: Nil ++
    operatorOptimizationBatch) :+
    Batch("Join Reorder", Once,
      CostBasedJoinReorder) :+
    Batch("Decimal Optimizations", fixedPoint,
      DecimalAggregates) :+
    Batch("Object Expressions Optimization", fixedPoint,
      EliminateMapObjects,
      CombineTypedFilters) :+
    Batch("LocalRelation", fixedPoint,
      ConvertToLocalRelation,
      PropagateEmptyRelation) :+
    // The following batch should be executed after batch "Join Reorder" and "LocalRelation".
    Batch("Check Cartesian Products", Once,
      CheckCartesianProducts) :+
    Batch("RewriteSubquery", Once,
      RewritePredicateSubquery,
      ColumnPruning,
      CollapseProject,
      RemoveRedundantProject)
  }

  如上这便是在优化这步的所有的规则和策略例如消除子查询别名,表达式替换、算子下推、常量折叠等优化规则,经过这一步之后,就进入物理计划阶段了。

Spark SQL(6) OptimizedPlan

原文地址:https://www.cnblogs.com/ldsggv/p/13380953.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7069.html

(0)
上一篇 2023-03-27
下一篇 2023-03-27

相关推荐

  • Python工程师必备:pipwhl安装教程

    Python工程师必备:pipwhl安装教程Python是一种解释性、面向对象、高级程序设计语言,与其他语言相比,Python几乎可以应用于任何领域,其强大的生态系统也为Python的发展提供了强大的动力。尤其是在机器学习、Web应用程序、游戏开发、科学计算和数据分析等领域,Python表现出了极高的可靠性和高效性。

    2024-06-06
    46
  • Python获取当前路径

    Python获取当前路径在开发Python程序时,获取当前程序运行路径是一个常见的需求。当前路径通常用于读取或写入文件,或者在程序中使用相对路径进行文件的引用。在本文中,我们将介绍如何使用Python来获取当前路径。

    2024-04-28
    103
  • Python模块——NumPy:高效处理数组和矩阵运算

    Python模块——NumPy:高效处理数组和矩阵运算NumPy是Python中最重要的第三方库之一,特别是在数据科学和机器学习领域。它是一个开源的Python扩展库,支持高性能的科学计算和数据分析。一般来说,使用Python进行数据分析一定会用到NumPy。其中的ndarray类型,是在Python中进行大规模数值运算的必备类型,它可以提高Python数值运算的效率。

    2024-04-05
    69
  • Python中Scipy插值函数的使用

    Python中Scipy插值函数的使用在科学计算中,数据往往是散点的,而不是连续的函数,很多需要连续数据的应用,比如对两个数据点之间的数值进行求解,便需要使用插值函数进行处理。

    2024-04-19
    67
  • 中国银行KONDOR系统_TIDB在win10安装

    中国银行KONDOR系统_TIDB在win10安装作者介绍:韩宇,中国银行信息科技运营中心工程师。 本文的内容可能和之前的金融企业将 TiDB 应用在业务上的实践不同,下面主要介绍我们如何把 TiDB 应用在金融行业的后台运维监控上。Zabbix …

    2023-03-17
    142
  • 提高代码效率的超实用小技巧,让你的Python sleep clock更智能化

    提高代码效率的超实用小技巧,让你的Python sleep clock更智能化a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-01-31
    98
  • PostgreSQL使用repmgr配置级联复制「终于解决」

    PostgreSQL使用repmgr配置级联复制「终于解决」最近的项目要求配置共享存储的四节点集群,使集群能够形成负载均衡。 但是大家知道,PostgreSQL不支持使用同一数据目录生成多个实例,在执行pg_ctl start的时候,如果指定的数据目录有实例在

    2023-02-13
    142
  • mysql的操作_MySQL source

    mysql的操作_MySQL source前提要述:参考书籍《MySQL必知必会》 《MySQL必知必会》是先讲了查询,但是没有记录就无法查询,所以先将如何添加数据。 表已经知道怎么创建了,随便创两张。 5.1 插入数据 MySQL使用 IN

    2023-01-22
    149

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注