【问题标题】:Converting CoordinateMatrix to RowMatrix doesn't preserve row order将 CoordinateMatrix 转换为 RowMatrix 不会保留行顺序
【发布时间】:2015-12-24 21:06:51
【问题描述】:

在 Spark-shell 中,我创建了一个坐标矩阵:

import org.apache.spark.mllib.linalg.distributed.{
  CoordinateMatrix, MatrixEntry}
val entries = sc.parallelize(Seq(
  Array(0, 1, 1), Array(0, 2, 2), Array(0, 3, 3), 
  Array(0, 4, 4), Array(1, 2, 5), Array(1, 3, 6),
  Array(1, 4, 7), Array(2, 3, 8), Array(2, 4, 9),
  Array(3, 4, 10))).map(f => MatrixEntry(f(0), f(1), f(2)))

val mat: CoordinateMatrix = new CoordinateMatrix(entries)

这是:

0 1 2 3 4
0 0 5 6 7
0 0 0 8 9
0 0 0 0 10

现在我想将其转换为 RowMatrix 并查看条目:

scala> mat.toRowMatrix.rows.collect
res1: Array[org.apache.spark.mllib.linalg.Vector] = Array((5,[1,2,3,4],[1.0,2.0,3.0,4.0]), (5,[2,3,4],[5.0,6.0,7.0]), (5,[4],[10.0]), (5,[3,4],[8.0,9.0]))

奇怪的是,第三行和第四行在 RowMatrix 中互换。那有什么问题?谢谢。

【问题讨论】:

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


    【解决方案1】:

    这并不奇怪。正如您在the API docsRowMatrix 中看到的那样:

    表示具有没有有意义的行索引的面向行的分布式矩阵。

    此外,将CoordinateMatrix 转换为任何其他类型的分布式矩阵需要重新分区,并且输出行/块的顺序部分取决于矩阵的分区数和维度,但除此之外它不是确定性的。

    如果行的顺序很重要,您应该使用IndexedRowMatrix。它仍然不能保证行的顺序,但IndexedRow 保留了索引,如果需要,可以使用这些索引对行进行重新排序。

    【讨论】:

    • 我的荣幸。我意识到最初的答案并不完全清楚,所以我添加了一些说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多