我正在尝试通过使用以下代码过滤掉null或空字符串的行来创建新数据框:
val df1 = df.filter(df("fieldA") != "").cache()
然后我收到以下错误:
<console>:32: error: overloaded method value filter with alternatives:
(conditionExpr: String)org.apache.spark.sql.DataFrame <and>
(condition: org.apache.spark.sql.Column)org.apache.spark.sql.DataFrame
cannot be applied to (Boolean)
val df1 = df.filter(df("fieldA") != "").cache()
^
有谁知道我在这里错过了什么?谢谢!
答案 0 :(得分:21)
在Scala中,为了按列比较相等,您应该在Spark 2.0 +中使用===
和!==
(或=!=
):
val df1 = df.filter(df("fieldA") !== "").cache()
或者,您可以使用表达式:
val df1 = df.filter("fieldA != ''").cache()
您的错误发生是因为每个Scala对象中都存在!=
运算符,并且它用于比较对象,始终返回布尔值。但是,filter
函数需要Column对象或String中的表达式,因此!==
类中有Column
运算符,它返回另一个列,然后可以在你想要的方式。
要查看列可用的所有操作,Column scaladoc非常有用。此外,还有functions
包。