Scala 为什么对不存在(未选定)的列进行过滤会起作用?
下面是一个简单的例子Scala 为什么对不存在(未选定)的列进行过滤会起作用?,scala,apache-spark,Scala,Apache Spark,下面是一个简单的例子 val df1 = spark.createDataFrame(Seq((0, "a"), (1, "b"))).toDF("foo", "bar") val df2 = df1.select($"foo") val df3 = df2.filter($"bar" === lit("a")) df1.printSchema df1.show df2.printSchema df2.show df3.printSchema df3.show 运行时无错误: root
val df1 = spark.createDataFrame(Seq((0, "a"), (1, "b"))).toDF("foo", "bar")
val df2 = df1.select($"foo")
val df3 = df2.filter($"bar" === lit("a"))
df1.printSchema
df1.show
df2.printSchema
df2.show
df3.printSchema
df3.show
运行时无错误:
root
|-- foo: integer (nullable = false)
|-- bar: string (nullable = true)
+---+---+
|foo|bar|
+---+---+
| 0| a|
| 1| b|
+---+---+
root
|-- foo: integer (nullable = false)
+---+
|foo|
+---+
| 0|
| 1|
+---+
root
|-- foo: integer (nullable = false)
+---+
|foo|
+---+
| 0|
+---+
然而,我期待着像这样的事情
org.apache.spark.sql.AnalysisException: cannot resolve '`bar`' given input columns: [foo];
出于同样的原因,我
org.apache.spark.sql.AnalysisException: cannot resolve '`asdasd`' given input columns: [foo];
当我这样做的时候
val df4 = df2.filter($"asdasd" === lit("a"))
但事实并非如此。为什么?我倾向于称之为bug。一个
解释计划
告诉我们更多:
val df1 = Seq((0, "a"), (1, "b")).toDF("foo", "bar")
df1.select("foo").where($"bar" === "a").explain(true)
// == Parsed Logical Plan ==
// 'Filter ('bar = a)
// +- Project [foo#4]
// +- Project [_1#0 AS foo#4, _2#1 AS bar#5]
// +- LocalRelation [_1#0, _2#1]
//
// == Analyzed Logical Plan ==
// foo: int
// Project [foo#4]
// +- Filter (bar#5 = a)
// +- Project [foo#4, bar#5]
// +- Project [_1#0 AS foo#4, _2#1 AS bar#5]
// +- LocalRelation [_1#0, _2#1]
//
// == Optimized Logical Plan ==
// LocalRelation [foo#4]
//
// == Physical Plan ==
// LocalTableScan [foo#4]
显然,解析的逻辑计划
和分析的(或解析的)逻辑计划
在它们的项目节点
(即)中仍然包含条
,并且过滤操作继续遵循假定删除的列
另一方面,以下查询的逻辑计划也包括删除的列,因此显示出类似的异常:
df1.drop("bar").where($"bar" === "a")
可能spark创建了类似SQL请求的东西,它是select和filter的惰性组合:
select foo from X,其中bar='a'
。有一个X表格,其中既有bar
列,也有foo
列。对不起,我的英语大部分请求Spark make lazy和with optimization lazy optimization不应影响结果,即更改语义。谢谢。我刚刚为此发行了一期Jira: