将 CoordinateMatrix 转换为 RowMatrix 不保留行顺序
Converting CoordinateMatrix to RowMatrix doesn't preserve row order
在 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中交换了。这有什么问题?谢谢
这并不奇怪。正如您在 the API docs、RowMatrix
:
中所读到的
Represents a row-oriented distributed Matrix with no meaningful row indices.
此外,将 CoordinateMatrix
转换为任何其他类型的分布式矩阵需要重新分区,输出行/块的顺序部分取决于矩阵的分区数和维数,但除此之外它不是确定性的。
如果行的顺序很重要,您应该使用 IndexedRowMatrix
。它仍然不能保证行的顺序,但 IndexedRow
保留索引,必要时可用于对行重新排序。
在 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中交换了。这有什么问题?谢谢
这并不奇怪。正如您在 the API docs、RowMatrix
:
Represents a row-oriented distributed Matrix with no meaningful row indices.
此外,将 CoordinateMatrix
转换为任何其他类型的分布式矩阵需要重新分区,输出行/块的顺序部分取决于矩阵的分区数和维数,但除此之外它不是确定性的。
如果行的顺序很重要,您应该使用 IndexedRowMatrix
。它仍然不能保证行的顺序,但 IndexedRow
保留索引,必要时可用于对行重新排序。