2015-10-13 18 views
0

我對Scala和Spark非常陌生,我無法從評級文件創建相關矩陣。它與this question類似,但是我有矩陣形式的稀疏數據。我的數據是這樣的:評分文件中的Spark - 相關矩陣

<user-id>, <rating-for-movie-1-or-null>, ... <rating-for-movie-n-or-null>

123, , , 3, , 4.5 
456, 1, 2, 3, , 4 
... 

是最有前途的,到目前爲止看起來像這樣的代碼:

val corTest = sc.textFile("data/collab_filter_data.txt").map(_.split(",")) 
Statistics.corr(corTest, "pearson") 

(我知道user_ids中有缺陷,但我願意與此同時生活)

我期待輸出像:

1, .123, .345 
.123, 1, .454 
.345, .454, 1 

這是一個矩陣,顯示每個用戶如何與每個其他用戶關聯。在圖形上,這將是一個相關圖。

這是一個完全noob問題,但我一直與它鬥爭了幾個小時,似乎無法谷歌我的出路。

+0

可以容易地去除第一元件,包含的用戶ID的一個,與'_.split(「」)降( 1)' – Paul

回答

3

我相信這個代碼將要完成你想要什麼:

import org.apache.spark.mllib.stat.Statistics 
import org.apache.spark.mllib.linalg._ 
... 
val corTest = input.map { case (line: String) => 
    val split = line.split(",").drop(1) 
    split.map(elem => if (elem.trim.isEmpty) 0.0 else elem.toDouble) 
}.map(arr => Vectors.dense(arr)) 

val corrMatrix = Statistics.corr(corTest) 

在這裏,我們正在映射您的輸入到String陣,丟棄用戶id元素,歸零的空白,終於創造了密集的矢量從結果數組中。另外請注意,如果未提供方法,則默認使用Pearson的方法。

當外殼與一些實例中運行,我看到以下:

scala> val input = sc.parallelize(Array("123, , , 3, , 4.5", "456, 1, 2, 3, , 4", "789, 4, 2.5, , 0.5, 4", "000, 5, 3.5, , 4.5, ")) 
input: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[18] at parallelize at <console>:16 

scala> val corTest = ... 
corTest: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[20] at map at <console>:18 

scala> val corrMatrix = Statistics.corr(corTest) 
... 
corrMatrix: org.apache.spark.mllib.linalg.Matrix = 
1.0     0.9037378388935388 -0.9701425001453317 ... (5 total) 
0.9037378388935388 1.0     -0.7844645405527361 ... 
-0.9701425001453317 -0.7844645405527361 1.0     ... 
0.7709910794438823 0.7273340668525836 -0.6622661785325219 ... 
-0.7513578452729373 -0.7560667258329613 0.6195855517393626 ... 
+0

確實有幫助。非常感謝。解析我的真實生活CSV時,我得到了一個索引超出界限的錯誤。我在'split.map(elem => if(elem.isEmpty)0.0 else elem.toDouble)'末尾添加了'.padTo(100,0.0)'',現在我得到了我想要的結果。 – brycemcd