val new_df = df.filter($"type_interne" !== "" || $"type_interne" !== "null")
给我错误值||
不是字符串的成员
当我使用===
适用于过滤器
val new_df = df.filter($"type_interne" === "" || $"type_interne" === "null")
答案 0 :(得分:8)
问题似乎是运算符优先级,尝试使用大括号:
val new_df = df.filter(($"type_interne" !== "") || ($"type_interne" !== null))
您也可以这样写:
val new_df = df.filter(($"type_interne" !== "") or $"type_interne".isNotNull)
答案 1 :(得分:3)
虽然Raphael的回答在撰写本文时完全正确,但火花正在演变......
从版本2.0开始,不推荐使用运算符!==
,但您可以使用=!=
来解决上面的优先级问题而不使用括号。请参阅源代码中的相应注释:
https://github.com/apache/spark/blob/branch-2.2/sql/core/src/main/scala/org/apache/spark/sql/Column.scala#L319-L320
详细答案:
我还要注意一些在开始时对我来说不明显的事情。
有一些DataFrame(DF)和DataSet(DS)的概念,它们也将它们在上面的上下文中的用法分为:
1)由催化剂解释的字符串(错误仅在运行时捕获) - DF和DS
case class NullStrings(n:Int,s:String)
val df = spark.sparkContext.parallelize(Seq(
(1, "abc"),
(2, "ABC"),
(3, null),
(4, ""))
).toDF("n", "s")
df.filter("s is not null and s != ''").show()
+---+---+
| n| s|
+---+---+
| 1|abc|
| 2|ABC|
+---+---+
2)使用Column
概念($
带spark.implicits._
导入)的数据帧语法部分编译检查:
df.filter($"s" =!= "" || $"s" =!= null).show()
但实际上=!=
忽略空值(请参阅<=>
进行无效安全比较),因此下面等于
df.filter($"s" =!= "").show()
+---+---+
| n| s|
+---+---+
| 1|abc|
| 2|ABC|
+---+---+
3)数据集
val ds = df.as[NullStrings]
ds.filter(r => r.s != null && r.s.nonEmpty).show()
+---+---+
| n| s|
+---+---+
| 1|abc|
| 2|ABC|
+---+---+
小心如果在案例类中使用Option
,则必须处理它,而不是简单的字符串。
case class NullStringsOption(n: Int, s: Option[String])
val ds1 = df.as[NullStringsOption]
ds1.filter(_.s.exists(_.nonEmpty)).show()