2017-06-21 238 views
4

我正在嘗試提高在Spark中使用Java實現的Logistic迴歸算法的準確性。爲此,我試圖使用該列中最頻繁的值替換列中存在的空值或無效值。例如: -如何使用Java中的spark使用Dataframe中的特定值替換空值?

Name|Place 
a |a1 
a |a2 
a |a2 
    |d1 
b |a2 
c |a2 
c | 
    | 
d |c1 

在這種情況下,我會在列「名」與「A」和列「地方」與「A2」全部替換爲空值。到目前爲止,我只能提取特定列中最頻繁的列。您可以幫我解決第二步如何用該列最頻繁的值替換空值或無效值。

回答

8

您可以使用.na.fill函數(它是org.apache.spark.sql.DataFrameNaFunctions中的函數)。

基本上你需要的功能是:def fill(value: String, cols: Seq[String]): DataFrame

可以選擇列,你選擇要更換空或NaN值。

你的情況,這將是這樣的:

val df2 = df.na.fill("a", Seq("Name")) 
      .na.fill("a2", Seq("Place")) 
+0

它是否可用Java?我無法找到類似的填充功能。 – PirateJack

+0

對不起,我沒有在Java中使用它,但你可以在這裏找到Spark的最新版本文檔,你可以在那裏看到DataFrameNaFunctions:https://spark.apache.org/docs/latest/api/java/index .html可能會嘗試填寫沒有.na – Rami

+0

@PirateJack你能接受答案,如果它解決了你的問題? – Rami

3

您可以使用DataFrame.na.fill()一些價值 更換空要一次就可以作爲

val map = Map("Name" -> "a", "Place" -> "a2") 

df.na.fill(map).show() 

做,但如果你更新想要替換一個不好的記錄,那麼你需要先驗證不良記錄。您可以使用like函數使用正則表達式來執行此操作。

+0

我需要爲每個列分開而不是整個數據幀一次。你可以請分享一個例子,我將如何取代任何價值。另外,我將爲不良記錄創建一個正則表達式。如果您有,請分享java示例。謝謝。 – PirateJack

2

您將需要使用數據框的fill(String value,String [] columns)方法,該方法會自動用指定的值替換給定列列中的空值。

所以,如果你已經知道你想...更換空值:

String[] colNames = {"Name"} 
dataframe = dataframe.na.fill("a", colNames) 

你可以做你列的其餘部分是相同的。

+0

我的數據框的類型爲數據集。它說它沒有爲數據集類型定義 PirateJack

+0

我已經更新了我的答案以包含.na部分。您也可以嘗試: df.na.fill(ImmutableMap.of(「ColumnName」,「replacementValue」,「egName」,「egA」); –

+1

非常感謝您的幫助,我可以使用scala序列庫。我會在我的回答中更新。 – PirateJack

0

爲了用給定的字符串替換NULL值,我使用了Spark for Java中的fill函數。它接受要替換的單詞和一系列列名稱。以下是我如何實現: -

List<String> colList = new ArrayList<String>(); 
colList.add(cols[i]); 
Seq<String> colSeq = scala.collection.JavaConverters.asScalaIteratorConverter(colList.iterator()).asScala().toSeq(); 
data=data.na().fill(word, colSeq); 
相關問題