Spark - 来自评级文件的相关矩阵

时间:2015-10-13 21:08:26

标签: scala apache-spark

我对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问题,但我已经与它斗争了几个小时,而且我似乎无法以谷歌的方式摆脱它。

1 个答案:

答案 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   ...