2015-08-26 82 views
0

我有一個RDD [(User,Item,Count/Rating)],我想將它轉換爲RDD [Vector(ItemRatings)],其中每個Vector是該項目的評分在用戶空間。有沒有辦法做到這一點,而不先收集驅動程序?我目前使用的是Datastax 4.7,Spark 1.2.1。Spark矢量RDD創建不收集到驅動程序

謝謝!

+0

'RDD.groupByKey'不是你要找的東西嗎? –

+1

你的RDD [Vector(ItemRatings)]是什麼,因爲你有三個實體是User,Item和Rating。什麼是ItemRatings實體?它代表什麼? – eliasah

+0

RDD [Vector(ItemRatings)]中的每一行都是單個用戶的收視率向量。 @DanielDarabos - groupByKey會工作,除了我需要它轉換爲RowMatrix –

回答

1

假設UserItem編碼爲Long的值,您可以使用CoordinateMatrix

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

val mat: CoordinateMatrix = new CoordinateMatrix(
    rdd.map{case (user, item, rating) => MatrixEntry(item, user, rating)} 
) 

val vectorRDD: RDD[Vector] = mat.toRowMatrix.rows 
+0

列相似函數的向量謝謝..這是一個有用的解決方案。不幸的是,用戶和項目和字符串..但我想我可以變成龍如果沒有替代品。 –

+0

你可以像[Daniel Darbos](http://stackoverflow.com/users/3318517/daniel-darabos)中提到的那樣使用'groupBy',但是你仍然需要在vector中的'user'和index之間的映射。 – zero323