【问题标题】:Null check for Double/Int Value in SparkSpark 中 Double/Int 值的空值检查
【发布时间】:2016-09-13 10:22:28
【问题描述】:

我是 Spark 的新手, 如何在 scala 或 Spark 中检查 Double 中的 Null 值和 Int 值。

Like for String 我们可以这样做:

val value = (FirstString.isEmpty()) match {
          case true => SecondString
          case _    => FirstString
        }

我搜索了很多,但我只找到了字符串值。能否请您推荐我的其他数据类型。

提前致谢。

【问题讨论】:

    标签: scala hadoop apache-spark hive


    【解决方案1】:

    null 仅适用于 Scala 中的 AnyRef(即非原始类型)类型。 AnyVal 类型不能设置为 null。

    例如:

    // the below are AnyVal(s) and wont compile
    val c: Char = null
    val i: Int = null
    val d: Double = null  
    

    String 是 AnyRef,因此可以为 null:

    // this is ok!
    val c: String = null 
    

    这就是无法将空值与 Int/Double 类型进行模式匹配的原因:

    // wont compile!
    null match {
            case a:Int => "is a null Int"
            case _ => "something else"
            }
    

    【讨论】:

      【解决方案2】:

      也许你可以简单地使用Options。比如:

      val d: Double = ...
      
      val isNull = Option(d).isDefined
      

      或者你可以使用模式匹配:

      val d: Double = ...
      
      Option(d) match {
        case Some(v) => use v
        case _ => you got Null
      }
      

      【讨论】:

      • 这毫无意义:因为Double 不能为空,Option(d) 将始终为Some。如果... 中的代码实际上不是Double,而是java.lang.Double(可以为null),那么您将在该行得到一个异常。
      • 改用 Try{}
      【解决方案3】:

      isEmpty 与“检查空值”完全不同。在null 上调用isEmpty 将失败:

      val s: String = null
      s.isEmpty // throws NullPointerException
      

      IntDouble 不能为空(任何其他原始类型也不能),因此无需检查它们是否为空。如果您专门讨论 Spark Rows,则需要在获取 Int/Double/其他原始值之前检查 null

      It is invalid to use the native primitive interface to retrieve a value that is null, instead a user must check isNullAt before attempting to retrieve a value that might be null.

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 2019-03-27
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        相关资源
        最近更新 更多