2015-01-26 136 views
9

如何转换org.apache.spark.mllib.linalg.MatrixRDD[org.apache.spark.mllib.linalg.Vector] in Spark?如何将矩阵转换为火花中的RDD [矢量]

该矩阵是从SVD生成的,我使用SVD的结果进行聚类分析。

+1

你能具体谈谈哪几类? ('Vector'是不可变的Scala矢量(http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Vector)或Java的'java.util.Vector',或者其他来自Python?矩阵如何表示,它的类型是什么?) – 2015-01-26 21:35:21

+0

@GáborBakos:从江的编辑看来,我们谈论的是MLlib的“矩阵”和“矢量”。 – 2015-01-27 14:43:21

回答

7

MLlib的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。 – 2015-01-27 14:29:36

+0

啊,我明白了!我已经更新了答案,以减少暴躁:)。无论如何希望代码工作! – 2015-01-27 14:40:53

+0

非常感谢!我来自机器学习领域,我对Spark和Scala非常陌生。从机器学习的角度来看,只要它们是相同的数据,我不关心它们如何在内存中存储或表示。所以我很难将相同的数据从一种格式转换为另一种格式。你对我的经历有什么想法吗?再次感谢。 – 2015-01-27 14:47:30