在spark mllib naive bayes代码中,它怎么能这样做?
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)},
答案 0 :(得分:1)
它的编写方式不是赋值,而是返回添加了元素的新向量的方法。从本质上讲,c._2 += v.toBreeze
更正式地写为(c._2).+=(v.toBreeze)
。
如果您查看breeze.linalg.DenseVector
的API(BDV
类别名),您会注意到有一个方法+=
,该方法使用元件。这是在这种情况下应用的方法。
回到你的例子,这意味着有问题的代码(combineByKey()
的第二个参数是创建一个递增Long
(c._1 + 1L
)的函数以及聚合将org.apache.spark.mllib.linalg.Vector
加入breeze.linalg.DenseVector
(c._2 += v.toBreeze
)。向量聚合的方式是使用+=
方法返回新的DenseVector
。