2017-06-14 130 views
1

在spark map函數中使用下劃線參數或命名參數時,我看到一些差異。scala下劃線參數不作爲命名參數,在火花映射中減少

看看這個代碼(在火花外殼執行):

var ds = Seq(1,2,3).toDS() 
ds.map(t => Array("something", "" + t)).collect // works cool 
ds.map(Array("funk", "" + _)).collect // doesn't work 

我得到了不工作線的例外是:

error: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.

回答

5

這是因爲擴張:

ds.map(Array("funk", "" + _)).collect 

不按照您的想法工作。它擴展爲:

ds.map(Array("funk", ((x: Any) => "" + x))).collect 

數組創建中的_擴展爲函數。根據DataSets的文檔,不支持函數。

如果我們把一個最小的重現:

val l = List(1,2,3) 
val res = l.map(Array("42", "" + _)) 

而看到打字員擴展(​​),你可以看到:

def main(args: Array[String]): Unit = { 
    val l: List[Int] = scala.collection.immutable.List.apply[Int](1, 2, 3); 
    val res: List[Object] = 
    l.map[Object, List[Object]] 
    (scala.Predef.wrapRefArray[Object] 
     (scala.Array.apply[Object]("42", ((x$1: Any) => "".+(x$1)) 

如果我們孤立的具體相關的部分,我們可以看到, :

(x$1: Any) => "".+(x$1) 

是數組創建過程中發生的擴展。

+0

在第二個代碼行中有一個額外的'「」+「。 –

+0

@Alexey謝謝!固定。 –