2016-02-19 65 views
4

我需要替換DataFrame(模式中的零和零)的Column中的一些值,我知道這種方法不是很準確,但我只是在練習。我精通Apache Spark的Python文檔,這些示例往往更具說明性。因此,除了Scala文檔之外,我決定首先看看那裏,並且我注意到使用DataFramesreplace方法可以實現我需要的功能。使用Scala API替換DataFrame的值

在這個例子中,我將2全部替換爲20col

df = df.replace("2", "20", subset="col")

獲得一些信心與Python API後,我決定複製這種對Scala,我在Scala DOC注意到一些奇怪的事情。首先,顯然DataFrames沒有方法replace。其次,在經過一些研究之後,我發現我必須使用DataFrameNaFunctionsreplace功能,但這很少見,如果您看到該方法的詳細信息,您會注意到它們使用的功能與python實現中的相同(請參閱圖像如下)。

replace documentation

在此之後,我試圖在Scala中運行這個爆炸,顯示下一個錯誤:

Name: Compile Error 
Message: <console>:108: error: value replace is not a member of org.apache.spark.sql.DataFrame 
        val dx = df.replace(column, Map(0.0 -> doubleValue)) 
          ^
StackTrace: 

然後我嘗試使用DataFrameNaFunctions應用replace,但我不能使其工作與python一樣容易,因爲我遇到了一個錯誤,我不明白爲什麼。

val dx = df.na.replace(column, Map(0.0 -> doubleValue)) 

這裏談到的錯誤:

Name: Compile Error 
Message: <console>:108: error: overloaded method value replace with alternatives: 
    [T](cols: Seq[String], replacement: scala.collection.immutable.Map[T,T])org.apache.spark.sql.DataFrame <and> 
    [T](col: String, replacement: scala.collection.immutable.Map[T,T])org.apache.spark.sql.DataFrame <and> 
    [T](cols: Array[String], replacement: java.util.Map[T,T])org.apache.spark.sql.DataFrame <and> 
    [T](col: String, replacement: java.util.Map[T,T])org.apache.spark.sql.DataFrame 
cannot be applied to (String, scala.collection.mutable.Map[Double,Double]) 
        val dx = df.na.replace(column, Map(0.0 -> doubleValue)) 
           ^
+0

它工作,如果我做'地圖(0.0 - > doubleValue).toMap',但它沒有在文檔中公開。 :| –

+0

你的第二次嘗試應該工作,但正如錯誤說你應該使用'immutable.Map'而不是'mutable.Map'。 通常,在使用spark – Odomontois

+0

I.e.時應避免可變集合。只需從正確的位置導入'Map':'scala.collection.immutable' – Odomontois

回答

0

顯然的問題是,我進口的一些圖書館從mutable包,所以我只需要執行該方法.toMap將其轉換爲immutable

val dx = df.na.replace(column, Map(0.0 -> doubleValue)) 
相關問題