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

Spark Scala compiler not complaining about double vs. triple equals

如果我尝试这个,我会得到一个编译器错误

df.filter($"foo" == lit(0))

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

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

df.filter($"foo".between(baz, quux) || $"foo" == lit(0))

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

因为 $"foo" == lit(0) 总是计算为 Boolean = false

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

现在在第二个案例中:

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

(((foo >= baz) AND (foo <= quux)) OR false)

因为您在列表达式 ($"foo".between(baz, quux)) 和文字布尔值 false.

之间执行了 OR ||,所以它被接受了

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