scala函数

时间:2015-10-16 01:52:19

标签: scala apache-spark apache-spark-mllib

在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)},

1 个答案:

答案 0 :(得分:1)

它的编写方式不是赋值,而是返回添加了元素的新向量的方法。从本质上讲,c._2 += v.toBreeze更正式地写为(c._2).+=(v.toBreeze)

如果您查看breeze.linalg.DenseVector的API(BDV类别名),您会注意到有一个方法+=,该方法使用元件。这是在这种情况下应用的方法。

回到你的例子,这意味着有问题的代码(combineByKey()的第二个参数是创建一个递增Longc._1 + 1L)的函数以及聚合将org.apache.spark.mllib.linalg.Vector加入breeze.linalg.DenseVectorc._2 += v.toBreeze)。向量聚合的方式是使用+=方法返回新的DenseVector