2015-01-26 3 views
9

Как конфертировать из org.apache.spark.mllib.linalg.Matrix в RDD[org.apache.spark.mllib.linalg.Vector] в Spark?Как преобразовать матрицу в RDD [Vector] in spark

Матрица создается из SVD, и я использую результаты SVD для анализа кластеризации.

+1

Не могли бы Вы более конкретно о типах? («Вектор» - неизменный вектор Scala (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Vector) или Java 'java.util.Vector', или что-то от Python? Как представлена ​​матрица, каков ее тип?) –

+0

@ GáborBakos: Из редактирования Jiang, похоже, мы говорим о «Matrix» и «Vector» MLlib. –

ответ

7

MLlib's Matrix - небольшая локальная матрица. Вероятно, было бы более эффективно анализировать его локально, а не превращать его в RDD.

Во всяком случае, если ваш кластеризация поддерживает только RDD в качестве входных данных, вот как вы можете сделать преобразование:

import org.apache.spark.mllib.linalg._ 
def toRDD(m: Matrix): RDD[Vector] = { 
    val columns = m.toArray.grouped(m.numRows) 
    val rows = columns.toSeq.transpose // Skip this if you want a column-major RDD. 
    val vectors = rows.map(row => new DenseVector(row.toArray)) 
    sc.parallelize(vectors) 
} 
+0

Матрица создается из метода svd. Я хочу использовать метод кластера kmeans для поиска кластеров матрицы, но метод kmeans принимает только RDD. –

+0

А, я вижу! Я обновил ответ, чтобы быть менее смешным :). Надеюсь, код работает в любом случае! –

+0

Большое спасибо! Я из области машинного обучения, и я очень новичок в Spark и Scala. С точки зрения машинного обучения, пока они одни и те же, мне все равно, как они хранятся или представлены в памяти. Поэтому мне очень сложно преобразовать одни и те же данные из одного формата в другой. У вас есть мысли о моем опыте? Еще раз спасибо. –

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