将CoordinateMatrix转换为数组?

时间:2015-12-31 07:20:36

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

我创建了一个CoordinateMatrix:

import org.apache.spark.mllib.linalg.distributed.{
  CoordinateMatrix, MatrixEntry}
val entries = sc.parallelize(Seq(
  MatrixEntry(0, 1, 1), MatrixEntry(0, 2, 2), MatrixEntry(0, 3, 3), 
  MatrixEntry(0, 4, 4), MatrixEntry(2, 3, 5), MatrixEntry(2, 4, 6),
  MatrixEntry(3, 4, 7)))
val mat: CoordinateMatrix = new CoordinateMatrix(entries)

0 1 2 3 4
0 0 0 0 0
0 0 0 5 6
0 0 0 0 7

然后我要打印这个矩阵。我首先将它转换为IndexedRowMatrix(行的顺序对我很重要,我不能丢失矩阵中的任何行):

scala> mat.toIndexedRowMatrix.rows.collect.sortBy(_.index)
res8: Array[org.apache.spark.mllib.linalg.distributed.IndexedRow] = 
    Array(IndexedRow(0,(5,[1,2,3,4],[1.0,2.0,3.0,4.0])), IndexedRow(2,(5,[3,4],[5.0,6.0])), IndexedRow(3,(5,[4],[7.0])))

但是在这个结果中第二行被删除,因为所有条目都是0.所以我不能再进一步打印矩阵(或将矩阵转换为Array [Array [Double]])。我不知道如何处理这个问题,谢谢。

1 个答案:

答案 0 :(得分:2)

通常,如果您需要分布式矩阵,那么收集和打印根本不是一种选择。您仍然可以将数据转换为BlockMatrix并作为本地DenseMatrix收集,如下所示:

mat.toBlockMatrix.toLocalMatrix
// res1: org.apache.spark.mllib.linalg.Matrix = 
// 0.0  1.0  2.0  3.0  4.0  
// 0.0  0.0  0.0  0.0  0.0  
// 0.0  0.0  0.0  5.0  6.0  
// 0.0  0.0  0.0  0.0  7.0