2015-01-26 132 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