繁体   English   中英

从RDD的元素创建一个SparseVector

[英]Create a SparseVector from the elements of RDD

使用Spark,我在Scala中具有类型为val rdd = RDD[(x: Int, y:Int), cov:Double]的数据结构,其中RDD的每个元素代表矩阵的元素,其中x代表行, y表示列, cov表示元素的值:

我需要从此矩阵的行创建SparseVectors。 因此,我决定首先将rdd转换为RDD[x: Int, (y:Int, cov:Double)] ,然后使用groupByKey将特定行的所有元素放在一起,如下所示:

val rdd2 = rdd.map{case ((x,y),cov) => (x, (y, cov))}.groupByKey()

现在,我需要创建SparseVectors:

val N = 7     //Vector Size
val spvec = {(x: Int,y: Iterable[(Int, Double)]) => new SparseVector(N.toLong, Array(y.map(el => el._1.toInt)), Array(y.map(el => el._2.toDouble)))}
val vecs = rdd2.map(spvec)

但是,这是弹出的错误。

type mismatch; found :Iterable[Int] required:Int
type mismatch; found :Iterable[Double] required:Double

我猜想y.map(el => el._1.toInt)返回一个不能在其上应用Array的可迭代方法。 如果有人可以提供帮助,我将不胜感激。

最简单的解决方案是将其转换为RowMatrix

import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry}

val rdd: RDD[((Int, Int), Double)] = ???

val vs: RDD[org.apache.spark.mllib.linalg.SparseVector]= new CoordinateMatrix(
  rdd.map{
    case ((x, y), cov) => MatrixEntry(x, y, cov)
  }
).toRowMatrix.rows.map(_.toSparse)

如果要保留行索引,则可以改用toIndexedRowMatrix

import org.apache.spark.mllib.linalg.distributed.IndexedRow

new CoordinateMatrix(
  rdd.map{
    case ((x, y), cov) => MatrixEntry(x, y, cov)
  }
).toIndexedRowMatrix.rows.map { case IndexedRow(i, vs) => (i, vs.toSparse) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM