【问题标题】:Scala Dataframe null check for columnsScala Dataframe 对列的空检查
【发布时间】:2016-11-09 05:47:17
【问题描述】:
val new_df = df.filter($"type_interne" !== "" || $"type_interne" !== "null")

给我错误值|| 不是字符串的成员

当我使用=== 时,过滤器效果很好

val new_df = df.filter($"type_interne" === "" || $"type_interne" === "null")

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    问题似乎是运算符优先级,尝试使用大括号:

     val new_df = df.filter(($"type_interne" !== "") || ($"type_interne" !== null))
    

    你也可以这样写:

    val new_df = df.filter(($"type_interne" !== "") or $"type_interne".isNotNull)
    

    【讨论】:

    • 使用 =!= 获取最新版本。
    【解决方案2】:

    尽管在撰写本文时拉斐尔的回答是完全正确的,但火花不断发展...... 运算符 !== 自 2.0 版起已弃用,但您可以使用 =!= 解决上述优先级问题,而无需使用括号。查看源码中对应的cmets: 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 案例类 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|
    +---+---+
    

    注意如果你在case类中使用Option,你必须处理它,而不是简单的字符串。

    case class NullStringsOption(n: Int, s: Option[String])
    
    val ds1 = df.as[NullStringsOption]
    
    ds1.filter(_.s.exists(_.nonEmpty)).show()
    

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2021-06-18
      • 2020-04-15
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多