【问题标题】:create a new accumulator and vector addition创建一个新的累加器和向量加法
【发布时间】:2015-12-05 21:00:36
【问题描述】:

我正在关注Spark Programming Guide,但遇到accumulatorVector 的一些问题

我有以下对象定义VectorAccumulatorParam

object VectorAccumulatorParam extends AccumulatorParam[Vector] {
    def zeros(initialValue: Vector): Vector = {
        Vectors.zeros( initialValue.size )
    }
    def addInPlace(v1: Vector, v2: Vector): Vector = {
        v1 += v2
    }
}

它的用法如下:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.AccumulatorParam
import org.apache.spark.mllib.linalg.{Vector, Vectors}

object SimpleSpark {
    def main(arg: Array[String]) = {
        /* some coed */

        val valAccum = sc.accumulator( Vector(1, 2, 3) )(VectorAccumulatorParam) 

        /* some coed */
}

但我有两个错误:

[error] /home/cliu/Documents/github/Apache-Spark/src/main/scala/SimpleSpark.scala:125: type mismatch;
[error]  found   : VectorAccumulatorParam.type
[error]  required: org.apache.spark.AccumulatorParam[scala.collection.immutable.Vector[Int]]
[error]         val valAccum = sc.accumulator( Vector(1, 2, 3) )(VectorAccumulatorParam) 
[error]                                                          ^
[error] /home/cliu/Documents/github/Apache-Spark/src/main/scala/SimpleSpark.scala:170: value += is not a member of org.apache.spark.mllib.linalg.Vector
[error]         v1 += v2
[error]            ^

第一:为什么会出现类型不匹配?这是编程指南中写的内容。它应该返回一个Vector

第二:如果v1 += v2操作不起作用,为什么指南是这样的?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:
    1. 您会收到类型错误,因为Vector(1, 2, 3) 创建了scala.collection.immutable.Vector,它是Array 的不可变等价物,而不是mllib.linalg.Vectormllib.linalg.Vectors 不提供伴生对象

    2. 正如Alberto Bonsanto mllib.linalg.Vectors 所说,不支持加法操作。

    3. 参数定义中还有一个错字。方法的正确名称是zero 而不是zeros

    4. 关于编程指南,我猜你错过了以下声明:

      假设我们有一个表示数学向量的 Vector 类,我们可以这样写

    您可以使用breeze.linalg.Vector 创建一个累加器:

    import breeze.linalg.{DenseVector => BDV}
    
    object VectorAccumulatorParam extends AccumulatorParam[BDV[Double]] {
      def zero(v: BDV[Double]): BDV[Double] = v
      def addInPlace(v1: BDV[Double], v2: BDV[Double]): BDV[Double] = v1 += v2
    }
    
    val valAccum = sc.accumulator(BDV.zeros[Double](3))(VectorAccumulatorParam) 
    

    另见:Difference between spark Vectors and scala immutable Vector?

    【讨论】:

    • DenseVectorVectorVectors有什么区别?
    【解决方案2】:

    第二个优先,因为它更容易。 如果你阅读Vector的文档你会发现他们没有+=方法,因此你想要实现的连接不能这样做,但是其他一些类支持该方法,看看在Accumulator,所以我的建议是编写自己的方法来实现这一点。

    【讨论】:

    • 您能否详细说明您所说的他们确实支持这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多