分析逻辑计划中什么是子查询别名节点?



我有一个简单的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))

为什么子查询别名显示在逻辑计划中?在我的 sql 中,我没有与别名相关的操作。

有人可以帮忙解释一下吗?谢谢!

SubqueryAlias 是一个一元逻辑运算符,它为为其创建的(子(子查询提供别名。别名可用于相关子查询的结构化查询的另一部分。

SubqueryAlias(以及一般的别名(在 Spark 优化器完成查询优化阶段(使用 EliminateSubqueryAliases 优化规则(之前可用。

引用 消除子查询别名优化:

子查询仅在提供属性的范围信息时才需要,并且可以在分析完成后将其删除。

在查询中,子查询是createOrReplaceTempView("t1")之前的部分。

spark.range(1, 100).createOrReplaceTempView("t1")

您可以将上述结构化查询重写为以下内容,这不会改变任何内容,但会给出更详细的解释。

val q = spark.range(1, 100)
q.createOrReplaceTempView("t1")

因此,q可以是任何其他结构化查询,因此需要一个别名来引用子查询中的任何输出属性。


explain查询时,您不会看到任何SubqueryAlias节点(这不仅是因为逻辑查询计划被规划到使用物理运算符的物理查询计划中(。

最新更新