2015-12-24 1 views
2

В Спарк-оболочки, я создал CoordinateMatrix:Преобразование CoordinateMatrix в RowMatrix не сохраняет порядок строк

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. В чем проблема? Благодарю.

ответ

1

Это не странно. Как вы можете прочитать в the API docs, RowMatrix:

представляет собой ряд ориентированных на распределенную матрицу с не значащие показатели ряда.

Кроме преобразование CoordinateMatrix к любому другому типу распределенной матрицы требует переразметки и порядка вывода строк/блоков зависит частично от числа перегородок и размеров матрицы, но помимо этого он не является детерминированным.

Если порядок строк важен, вы должны использовать IndexedRowMatrix. Он по-прежнему не гарантирует порядок строк, но IndexedRow сохраняет индексы, которые могут использоваться для изменения порядка строк, если это необходимо.

+0

Мое удовольствие. Я понял, что исходный ответ не совсем ясен, поэтому я добавил некоторые разъяснения. – zero323

Смежные вопросы