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: