2015-10-16 36 views
0

在spark mllib樸素貝葉斯代碼中,它如何做到這一點?scala函數中的更新參數

c._2 += v.toBreeze

v: Vector是mergeValue函數的參數,我們不能重新分配val。但是爲什麼在源代碼中有c._2 += v.toBreeze

這裏是源代碼:

mergeValue = (c: (Long, BDV[Double]), v: Vector) => { 
    requireNonnegativeValues(v) 
    (c._1 + 1L, c._2 += v.toBreeze)}, 

回答

1

它被寫入的道不分配,而是用於與所述元件加返回新的矢量的方法。本質上,c._2 += v.toBreeze更正式地寫爲(c._2).+=(v.toBreeze)

如果您查看breeze.linalg.DenseVector(其中BDV類別是別名)的API,您會注意到有一個方法+=,它將元素前置到矢量中。這是在這種情況下應用的方法。

再回到你的例子中,這意味着所討論的代碼(爲一個combineByKey()第二個參數是創建遞增Longc._1 + 1L)以及聚集體的org.apache.spark.mllib.linalg.Vectorbreeze.linalg.DenseVectorc._2 += v.toBreeze),該方法的功能該矢量聚合發生在+=方法返回一個新的DenseVector

+0

非常感謝,我明白了, – zhengjw