2017-08-21 94 views
1

我正在使用大量數據集(包含332個字段)在Apache Spark中使用Scala(除了一個字段,其餘331可以爲空),大約10M記錄。但我想用空字符串(「」)替換null。由於我有大量的字段,最好的方法是什麼? 我想在導入這個數據集的時候處理空值,這樣在執行轉換或導出到DF時我會很安全。所以我創建了332個字段的案例類,處理這些空值的最佳方法是什麼?我可以使用Option(field).getOrElse(「」),但我猜這不是最好的方法,因爲我有大量的字段。謝謝!!如何在Apache Spark中使用scala替換空字符串(「」)的空值

+0

@mtoto不應該將它標記爲此問題的重複:https://stackoverflow.com/questions/33376571/replace-null-values-in-火花非數據幀 – philantrovert

回答

2

我們可以使用udf獲得安全柱這樣

val df = Seq((1,"Hello"), (2,"world"), (3,null)).toDF("id", "name") 

val safeString: String => String = s => if (s == null) "" else s 
val udfSafeString = udf(safeString) 

val dfSafe = df.select($"id", udfSafeString($"name").alias("name")) 

dfSafe.show 

如果你有大量的字段,並且其中一列是關鍵列。我們可以這樣做。

val safeCols = df.columns.map(colName => 
    if (colName == "id") col(colName) 
    else udfSafeString(col(colName)).alias(colName)) 

val dfSafe = df.select(safeCols:_*) 
dfSafe.show 
0

你應該看看DataFrameNAFunctions。有一些函數可以將不同類型的字段中的空值替換爲默認值。

val naFunctions = explodeDF.na 
val nonNullDF = naFunctions.fill("") 

這會將字符串字段中的所有空值替換爲「」。

如果您的數據集包含一些字段具有不同的數據類型,那麼您必須通過給出該特定類型的默認值來重複相同的功能。例如,可以給Int字段默認值0.

相關問題