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



我需要在Spark Scala代码中将一些值映射到Int。问题是我的输入 CSV 中的空表示为"NA"。我需要将其转换为将被解释为 Null 的内容。

什么不起作用:

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

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

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

谢谢,米哈尔

简单回答IntLong没有NULL值,Boolean类型。 只有 DoubleFloatScala 中具有NULL值的NaN值。

因此,有2种解决方案适用于您的场景:

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)
}

CSV 数据源(在 Spark <2.0 中spark-csv,Spark>= 2.0 中的内置数据格式(提供了一个nullValue选项,可用于指定表示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

val df = spark.read.csv(path)
df.select(df.columns.map(col(_).cast("integer")): _*)

这应该给出相同的结果。

最新更新