我需要在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?
谢谢,米哈尔
简单回答:Int
和Long
没有NULL
值,Boolean
类型。 只有 Double
和 Float
在 Scala 中具有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")): _*)
这应该给出相同的结果。