Scala ApacheSpark中IndexedRowmatrix行/列求和的有效方法

Scala ApacheSpark中IndexedRowmatrix行/列求和的有效方法,scala,matrix,apache-spark,apache-spark-mllib,rowsum,Scala,Matrix,Apache Spark,Apache Spark Mllib,Rowsum,在Scala中有一个坐标矩阵格式的矩阵。矩阵是稀疏的,整体看起来像coo_Matrix.entries.collect Array[org.apache.spark.mllib.linalg.distributed.MatrixEntry] = Array( MatrixEntry(0,0,-1.0), MatrixEntry(0,1,-1.0), MatrixEntry(1,0,-1.0), MatrixEntry(1,1,-1.0), MatrixEntry(1,2,-1.0), M

在Scala中有一个坐标矩阵格式的矩阵。矩阵是稀疏的,整体看起来像coo_Matrix.entries.collect

Array[org.apache.spark.mllib.linalg.distributed.MatrixEntry] = Array(
  MatrixEntry(0,0,-1.0), MatrixEntry(0,1,-1.0), MatrixEntry(1,0,-1.0),
  MatrixEntry(1,1,-1.0), MatrixEntry(1,2,-1.0), MatrixEntry(2,1,-1.0), 
  MatrixEntry(2,2,-1.0), MatrixEntry(0,3,-1.0), MatrixEntry(0,4,-1.0), 
  MatrixEntry(0,5,-1.0), MatrixEntry(3,0,-1.0), MatrixEntry(4,0,-1.0), 
  MatrixEntry(3,3,-1.0), MatrixEntry(3,4,-1.0), MatrixEntry(4,3,-1.0),
  MatrixEntry(4,4,-1.0))
这只是一个小样本。矩阵的大小为nxn,其中N=100万,尽管大多数矩阵是稀疏的。在Spark Scala中,获得该矩阵行和的有效方法之一是什么?目标是创建一个由行和组成的新RDD,即大小为N的RDD,其中第一个元素是行1的行和,依此类推

我总是可以将这个坐标矩阵转换为IndexedRowMatrix,并运行for循环,一次迭代一次计算行和,但这不是最有效的方法


非常感谢您的任何想法。

由于洗牌,这将非常昂贵。这是您在这里无法避免的部分,但您可以将条目转换为pairdd并按键减少:

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

val mat: CoordinateMatrix = ???
val rowSums: RDD[Long, Double)] = mat.entries
  .map{case MatrixEntry(row, _, value) => (row, value)}
  .reduceByKey(_ + _)
与基于indexedRowMatrix的解决方案不同:


它不需要groupBy转换或中间sparsevector。

由于洗牌,它将非常昂贵。这是您在这里无法避免的部分,但您可以将条目转换为pairdd并按键减少:

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

val mat: CoordinateMatrix = ???
val rowSums: RDD[Long, Double)] = mat.entries
  .map{case MatrixEntry(row, _, value) => (row, value)}
  .reduceByKey(_ + _)
与基于indexedRowMatrix的解决方案不同:

它不需要groupBy转换或中间sparsevector