我有一个简单的sql如下,
test("SparkSQLTest") {
val spark = SparkSession.builder().master("local").appName("SparkSQLTest").getOrCreate()
spark.range(1, 100).createOrReplaceTempView("t1")
val df = spark.sql("select id from t1 where t1.id = 10")
df.explain(true)
}
分析的逻辑计划的输出是:
== Analyzed Logical Plan ==
id: bigint
Project [id#0L]
+- Filter (id#0L = cast(10 as bigint))
+- SubqueryAlias t1 ////don't understand here
+- Range (1, 100, step=1, splits=Some(1))
为什么SubqueryAlias出现在逻辑计划中?在我的sql中,我没有与别名相关的操作。
有人可以帮忙解释一下吗?谢谢!
答案 0 :(得分:1)
SubqueryAlias是一元逻辑运算符,它为其创建的(子)子查询提供别名。别名可以用于相关子查询的结构化查询的另一部分。
在Spark Optimizer完成查询优化阶段(使用EliminateSubqueryAliases优化规则)之前, SubqueryAlias
(以及一般的别名)可用。
子查询只需要提供属性的范围信息,一旦分析完成就可以删除。
在您的查询中,子查询是createOrReplaceTempView("t1")
之前的部分。
spark.range(1, 100).createOrReplaceTempView("t1")
您可以将以上结构化查询重写为以下内容,这些查询不会改变任何内容,但会给出更详细的解释。
val q = spark.range(1, 100)
q.createOrReplaceTempView("t1")
因此,q
可以是任何其他结构化查询,因此需要别名来引用子查询中的任何输出属性。
当您explain
查询时,您将看不到任何SubqueryAlias
个节点(这不仅是因为逻辑查询计划已计划到使用物理运算符的物理查询计划中)。