Spark Scala 编译器不会抱怨双等号与三等号

wrs*_*der 3 scala apache-spark apache-spark-sql

如果我尝试这样做,我会收到编译器错误

df.filter($"foo" == lit(0))
Run Code Online (Sandbox Code Playgroud)

忘记了我在 Spark 中需要一个三等号。

但是,如果我这样做,我会得到错误的答案,但没有错误:

df.filter($"foo".between(baz, quux) || $"foo" == lit(0))
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么编译时检查在第一种情况下对我有帮助,但在第二种情况下却没有帮助吗?

bla*_*hop 5

因为$"foo" == lit(0)总是被评估为Boolean = false

因此,在第一种情况下,您尝试filter通过传递布尔值来调用方法,而它需要字符串表达式或列表达式。因此你会得到一个错误。

现在来看第二种情况:

$"foo".between(baz, quux) || $"foo" == lit(0)被评估为:

(((foo >= baz) AND (foo <= quux)) OR false)
Run Code Online (Sandbox Code Playgroud)

||这是被接受的,因为您在列表达式 ( $"foo".between(baz, quux)) 和文字 boolean之间执行 OR 操作false

换句话说,它被解释为$"foo".between(baz, quux) || lit(false)