2015-09-04 30 views
3

我的問題是等同於R-相關帖子Create Sparse Matrix from a data frame,但我想在星火(最好在斯卡拉)執行同樣的事情。星火 - 如何創建項目收視率稀疏矩陣

從正被創建的稀疏矩陣中data.txt文件數據的樣品:

UserID MovieID Rating 
2  1  1 
3  2  1 
4  2  1 
6  2  1 
7  2  1 

所以最終的列是電影ID和行是用戶ID

1 2 3 4 5 6 7 
1 0 0 0 0 0 0 0 
2 1 0 0 0 0 0 0 
3 0 1 0 0 0 0 0 
4 0 1 0 0 0 0 0 
5 0 0 0 0 0 0 0 
6 0 1 0 0 0 0 0 
7 0 1 0 0 0 0 0 

我已經開始通過對data.txt文件(沒有標頭)進行map RDD轉換將值轉換爲整數,但後來......我找不到一個用於稀疏矩陣創建的函數。

val data = sc.textFile("/data/data.txt") 
val ratings = data.map(_.split(',') match { case Array(user, item, rate) => 
    Rating(user.toInt, item.toInt, rate.toInt) 
    }) 
...? 

回答

6

最簡單的方法是映射到Ratings一個MatrixEntries創建CoordinateMatrix

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

val mat = new CoordinateMatrix(ratings.map { 
    case Rating(user, movie, rating) => MatrixEntry(user, movie, rating) 
}) 

CoordinateMatrix可進一步轉化BlockMatrixIndexedRowMatrixRowMatrix分別使用toBlockMatrixtoIndexedRowMatrixtoRowMatrix到。

+0

我正在做類似於Python的東西:'mat = CoordinateMatrix(groupped_df.rdd.map(lambda r:MatrixEntry(r.userId,r.itemId,r.rating)))''。但是這不包含重複項目。所以,我的獨特用戶是4300,我的獨特用戶是2800,最後,我得到了座標矩陣是18300到90200。所以,這是一個正常的行爲,我該如何刪除重複? –

+1

@JimVer我會說這取決於業務邏輯。如果您對同一個用戶有重複的評分,那麼首先總結(平均數,中位數,最近一次)您的數據可能是有意義的。 – zero323