我需要添加存储在两个文件中的两个矩阵。

latest1.txtlatest2.txt的内容具有下一个str:

1 2 3
4 5 6
7 8 9

I am reading those files as follows:

scala> val rows = sc.textFile(“latest1.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble)
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0))
}

scala> val r1 = rows
r1: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14

scala> val rows = sc.textFile(“latest2.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble)
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0))
}

scala> val r2 = rows
r2: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14


我想添加r1,r2。因此,有没有办法在Apache-Spark中添加这两个RDD[mllib.linalg.Vector]

最佳答案

这实际上是一个好问题。我经常使用mllib进行工作,但没有意识到这些基本的线性代数运算不容易获得。

关键是底层的微风矢量具有您期望的所有线性代数操作-当然包括您具体提到的基本元素明智的加法运算。

但是,通过以下方式对外界隐藏了微风的实现:

[private mllib]


那么,从外部世界/公共API的角度来看,我们如何访问这些原语?

其中一些已经暴露:例如平方和:

/**
 * Returns the squared distance between two Vectors.
 * @param v1 first Vector.
 * @param v2 second Vector.
 * @return squared distance between two Vectors.
 */
def sqdist(v1: Vector, v2: Vector): Double = {
  ...
}


但是,此类可用方法的选择受到限制-并且实际上不包括基本操作,包括逐元素加法,减法,乘法等。

所以这是我能看到的最好的:


将向量转换为微风:
轻松执行向量运算
从微风转换回mllib Vector


这是一些示例代码:

val v1 = Vectors.dense(1.0, 2.0, 3.0)
val v2 = Vectors.dense(4.0, 5.0, 6.0)
val bv1 = new DenseVector(v1.toArray)
val bv2 = new DenseVector(v2.toArray)

val vectout = Vectors.dense((bv1 + bv2).toArray)
vectout: org.apache.spark.mllib.linalg.Vector = [5.0,7.0,9.0]

10-07 15:29