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)
如果我尝试这个,我会得到一个编译器错误
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
.
||
,所以它被接受了
换句话说就是解释为$"foo".between(baz, quux) || lit(false)