我需要在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
答案 0 :(得分:3)
简单回答:NULL
和Int
,Long
类型没有Boolean
值。只有Double
和Float
在 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
应该给出相同的结果。