2016-09-14 3 views
0

с использованием искровых, у меня есть структура данных типа val rdd = RDD[(x: Int, y:Int), cov:Double] в Scala, где каждый элемент RDD представляет собой элемент матрицы с x, представляющий строку, y, представляющий столбец и cov представляющий значение элемента:Создать Спарсевектор из элементов RDD

Мне нужно создать SparseVectors из строк этой матрицы. Поэтому я решил сначала преобразовать ДРР в RDD[x: Int, (y:Int, cov:Double)], а затем использовать groupByKey поместить все элементы определенной строки вместе, как это:

val rdd2 = rdd.map{case ((x,y),cov) => (x, (y, cov))}.groupByKey()

Теперь мне нужно создать SparseVectors:

val N = 7  //Vector Size 
val spvec = {(x: Int,y: Iterable[(Int, Double)]) => new SparseVector(N.toLong, Array(y.map(el => el._1.toInt)), Array(y.map(el => el._2.toDouble)))} 
val vecs = rdd2.map(spvec) 

Однако это ошибка, которая появляется.

type mismatch; found :Iterable[Int] required:Int 
type mismatch; found :Iterable[Double] required:Double 

Я предполагаю, что y.map(el => el._1.toInt) возвращается итератор, который Массив не может быть применен на. Я был бы признателен, если бы кто-то мог помочь в этом.

ответ

0

Самое простое решение для преобразования в RowMatrix:

import org.apache.spark.mllib.linalg.distributed.{CoordinateMatrix, MatrixEntry} 

val rdd: RDD[((Int, Int), Double)] = ??? 

val vs: RDD[org.apache.spark.mllib.linalg.SparseVector]= new CoordinateMatrix(
    rdd.map{ 
    case ((x, y), cov) => MatrixEntry(x, y, cov) 
    } 
).toRowMatrix.rows.map(_.toSparse) 

Если вы хотите сохранить индексы строк вы можете использовать вместо toIndexedRowMatrix:

import org.apache.spark.mllib.linalg.distributed.IndexedRow 

new CoordinateMatrix(
    rdd.map{ 
    case ((x, y), cov) => MatrixEntry(x, y, cov) 
    } 
).toIndexedRowMatrix.rows.map { case IndexedRow(i, vs) => (i, vs.toSparse) } 
+0

Спасибо. Он работает для 'toRowMatrix', но не для' toIndexedRowMatrix', говоря: 'значение toSparse не является членом org.apache.spark.mllib.linalg.distributed.IndexedRow'. Я хочу сохранить индексы строк. – EdgeRover

+0

Потому что он содержит 'IndexedRows' не' Vectors'. – zero323