相对于电影,我有DataFrame
个用户评分(从1到5)。为了获得第一列是电影ID的DataFrame
,其余列是每个用户对该电影的评级,我会执行以下操作:
val ratingsPerMovieDF = imdbRatingsDF
.groupBy("imdbId")
.pivot("userId")
.max("rating")
现在,我在这里得到一个DataFrame
,其中大多数值为null
,因为大多数用户只评价了几部电影。
我有兴趣计算这些电影之间的相似性(基于项目的协同过滤)。
我正在尝试使用评级列值组合RowMatrix
(使用mllib进行进一步的相似性计算)。但是,我不知道如何处理null
值。
以下代码我尝试为每行获取一个Vector:
val assembler = new VectorAssembler()
.setInputCols(movieRatingsDF.columns.drop("imdbId"))
.setOutputCol("ratings")
val ratingsDF = assembler.transform(movieRatingsDF).select("imdbId", "ratings")
给我一个错误:
Caused by: org.apache.spark.SparkException: Values to assemble cannot be null.
我可以使用.na.fill(0)
将它们替换为0,但这会产生不正确的相关结果,因为几乎所有的Vector都会变得非常相似。
在这种情况下,有人可以建议做什么吗?这里的最终目标是计算行之间的相关性。我想以某种方式使用SparseVectors
(忽略null
值,但我不知道如何。
我是Spark和Scala的新手,所以其中一些可能没什么意义。我想要更好地理解事情。