scala中数字NULL的字符串表示形式是什么?

时间:2017-04-06 09:16:55

标签: scala apache-spark

我需要在Spark Scala代码中将一些值映射到Int。 问题是输入CSV中的null表示为" NA"。 我需要将它转换为可以解释为Null的东西。

什么行不通:

replaceAll("NA", null).toInt
replaceAll("NA", "null").toInt
replaceAll("NA", "").toInt
replaceAll("NA", ".").toInt`

什么有效,但不是一个好的解决方案:     replaceAll("NA", 0).toInt

任何想法在这种转换中可以很好地表示NULL?

谢谢,Michal

2 个答案:

答案 0 :(得分:3)

简单回答NULLIntLong类型没有Boolean值。只有DoubleFloat Scala 中的NaN值具有NULL值。

因此,有两种解决方案适合您:

1.使用Option代表你的价值,NA映射到None,也许就像:

val myStr = "NA"
val result: Option[Int] = myStr match {
  case "NA" => None
  case i => Some(i.toInt)
}

2.使用Double替换号码Int类型

val myStr = "NA"
val result: Double = myStr match {
  case "NA" => Double.NaN
  case i => Some(i.toDouble)
}

答案 1 :(得分:2)

CSV数据源(Spark中的spark-csv< 2.0,Spark中的内置数据格式> = 2.0)提供了nullValue选项,可用于指定表示{{1}的字符串值。如果数据如下所示:

NULL

你可以阅读它:

1,NA,2
NA,3,4
4,5,NA

结果为:

spark
  .read.option("nullValue", "NA")
  .option("inferSchema", "true")  // Just for convenience 
  .csv(path)

您还可以将数据读取为字符串和+----+----+----+ | _c0| _c1| _c2| +----+----+----+ | 1|null| 2| |null| 3| 4| | 4| 5|null| +----+----+----+

cast

应该给出相同的结果。