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]
答案 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
节点可以明确地出现在逻辑查询计划中以供以下内容使用:
Project
,joinWith
,select
unionByName
运营商,即KeyValueGroupedDataset
,keys
mapValues
查询 SELECT
节点还可以显示分析和优化阶段。
在Spark SQL中,数据集API提供高级操作符,例如Project
,select
或filter
,最终构建结构化查询的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
可以来去,因为投影是输出中的列数,可能会也可能不会出现在您的计划和查询中。
您可以使用Spark SQL的 Catalyst DSL (在Project
包对象中)使用Scala隐式转换构建Catalyst数据结构。如果你进入Spark测试,这可能非常有用。
org.apache.spark.sql.catalyst.dsl
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`