执行查询计划中的Project节点是什么?

时间:2017-11-28 08:17:03

标签: apache-spark apache-spark-sql

Sparks执行计划中Project节点的含义是什么? 我有一个包含以下内容的计划:

+- Project [dm_country#population#6a1ad864-235f-4761-9a6d-0ca2a2b40686#834, dm_country#population#country#839, population#17 AS dm_country#population#population#844]
   +- Project [dm_country#population#6a1ad864-235f-4761-9a6d-0ca2a2b40686#834, country#12 AS dm_country#population#country#839, population#17]
      +- Project [6a1ad864-235f-4761-9a6d-0ca2a2b40686#22 AS dm_country#population#6a1ad864-235f-4761-9a6d-0ca2a2b40686#834, country#12, population#17]
         +- RepartitionByExpression [country#12], 1000
            +- Union
               :- Project [ind#7 AS 6a1ad864-235f-4761-9a6d-0ca2a2b40686#22, country#12, population#17]
               :  +- Project [ind#7, country#12, population#2 AS population#17]
               :     +- Project [ind#7, country#1 AS country#12, population#2]
               :        +- Project [ind#0 AS ind#7, country#1, population#2]
               :           +- Relation[ind#0,country#1,population#2] JDBCRelation(schema_dbadmin.t_350) [numPartitions=100]
               +- LogicalRDD [ind#45, country#46, population#47]

1 个答案:

答案 0 :(得分:5)

注意:由于该计划使用$(document).ready(function(){ animation(); }); function animation() { var timeline = anime.timeline({loop: false}); // no loop !! timeline .add({...}) .add({...}) .add({...}); timeline.complete = function() {animation();}; } 节点,因此它必须是逻辑查询计划。

逻辑查询计划中的

Project节点代表RepartitionByExpression一元逻辑运算符,只要您明确或隐式地使用某种投影,就会创建该节点。

更确切地说,Project节点可以明确地出现在逻辑查询计划中以供以下内容使用:

  1. 数据集运营商,即ProjectjoinWithselect
  2. unionByName运营商,即KeyValueGroupedDatasetkeys
  3. SQL mapValues查询
  4. SELECT节点还可以显示分析优化阶段。

    在Spark SQL中,数据集API提供高级操作符,例如Projectselectfilter,最终构建结构化查询的Catalyst逻辑计划。换句话说,这个外观简单的Dataset.select运算符只是用groupBy节点创建LogicalPlan

    Project

    (你可能已经使用val query = spark.range(4).select("id") scala> println(query.queryExecution.logical) 'Project [unresolvedalias('id, None)] +- Range (0, 4, step=1, splits=Some(8)) 进行了上述操作,但是这会给你所有可能隐藏该点的4个计划。

    您可以查看query.explain(extended = true)运算符的代码。

    Dataset.select

    这个看起来很简单的def select(cols: Column*): DataFrame = withPlan { Project(cols.map(_.named), logicalPlan) } 运算符仅仅是Catalyst运算符的包装器,用于构建逻辑运算符的Catalyst树,从而提供逻辑计划。

    注意 Spark SQL的催化剂的优点在于它使用了这种表示逻辑运算符或逻辑运算符树的递归LogicalPlan抽象。 / p>

    注意这同样适用于好的' SQL在解析后将SQL文本转换为逻辑运算符的AST。请参阅下面的示例。

    select可以来去,因为投影是输出中的列数,可能会也可能不会出现在您的计划和查询中。

    Catalyst DSL

    您可以使用Spark SQL的 Catalyst DSL (在Project包对象中)使用Scala隐式转换构建Catalyst数据结构。如果你进入Spark测试,这可能非常有用。

    org.apache.spark.sql.catalyst.dsl

    好的' SQL

    scala> spark.version
    res0: String = 2.3.0-SNAPSHOT
    
    import org.apache.spark.sql.catalyst.dsl.plans._  // <-- gives table and select
    import org.apache.spark.sql.catalyst.dsl.expressions.star
    val plan = table("a").select(star())
    scala> println(plan.numberedTreeString)
    00 'Project [*]
    01 +- 'UnresolvedRelation `a`