2016-12-01 75 views
-1

這是我下面的代碼:如何處理空值在SparkSQL Dataframes

val ebayds = sc.textFile("/user/spark/xbox.csv") 

case class Auction(auctionid: String, bid: Float, bidtime: Float, bidder: String, bidderrate: Int, openbid: Float, price: Float) 

val ebay = ebayds.map(a=>a.split(",")).map(p=>Auction(p(0),p(1).toFloat,p(2).toFloat,p(3),p(4).toInt,p(5).toFloat,p(6).toFloat)).toDF() 

ebay.select("auctionid").distinct.count 

,我得到的錯誤是:

For input string: "" 
     at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
+2

可能的重複[在Spark DataFrame中替換空值](https:// stackoverflow。com/questions/33376571/replace-null-values-in-spark-dataframe) – eliasah

+0

看起來你有一個空字符串''「',而不是'null'。沒有? –

回答

1

使用DataFrameNaFunctions

數據幀fill(double value)返回一個新的DataFrame,它用數值列替換值爲空的值爲 。

DataFrame填充(雙重 值,scala.collection.Seq cols)(特定於Scala)返回 新的DataFrame,它替換指定數字列中的空值。

實例應用:

df.na.fill(0.0,Seq("your columnname")) 

爲該列的空值將與0.0或任何默認值代替。

replace也是用默認值代替空字符串有用

更換公共數據幀取代(字符串欄, java.util.Map replacement)替換匹配替換映射相應的值鍵的值。鍵 和替換映射的值必須具有相同的類型,並且只能是 雙打或字符串。如果col是「*」,那麼將替換應用於所有字符串列或數字列的 。

import com.google.common.collect.ImmutableMap;

//在列「height」中用2.0代替所有出現的1.0。
df.replace(「height」,ImmutableMap.of(1.0,2.0));

//將 「name」列中的所有「UNKNOWN」替換爲「unnamed」。 df.replace(「name」,ImmutableMap.of(「UNKNOWN」,「unnamed」));

//將所有 字符串列中的所有「UNKNOWN」替換爲「未命名」。 df.replace(「*」,ImmutableMap.of(「UNKNOWN」, 「unnamed」));參數:山口 - 列的名稱來應用該值 替換替換 - 值替換映射,上述 返回所解釋:(無證)由於: 1.3.1

例如:

df.na.replace("your column", Map(""-> 0.0))) 
0

這對我有用。它返回了一個數據框。這裏AB是列,而1.0"unknown"是要被替換的值。

df.na.fill(Map("A" -> "unknown","B" -> 1.0))