我对Scala和Spark很新,我无法从评级文件中创建相关矩阵。它与this question类似,但我在矩阵形式中有稀疏数据。我的数据如下:
<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 :(得分: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的方法。
当在shell中运行一些示例时,我会看到以下内容:
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 ...