2017-04-06 44 views
1

我需要在Spark Scala代碼中將一些值映射到Int。 問題是我的輸入CSV中的空值表示爲「NA」。 我需要將其轉換爲可以解釋爲Null的內容。什麼是scala中numeric NULL的字符串表示形式?

什麼不起作用:

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

什麼工作,但不是一個很好的解決方案: replaceAll("NA", 0).toInt

任何想法可能是空的。在這種轉換很好的代表?

感謝,米哈爾

回答

3

簡單地回答:對於IntLongBoolean類型沒有NULL值。只有DoubleFloat具有用於斯卡拉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類型,請number

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

CSV dat源(spark-csv在火花< 2.0,內置在火花> = 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")): _*) 

wh我應該給出相同的結果。

相關問題