我创建了一个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]])。我不知道如何处理这个问题,谢谢。
答案 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