【发布时间】:2018-04-30 08:56:24
【问题描述】:
我有一个DataFrame 相对于电影的用户评分(从 1 到 5)。为了获得DataFrame,其中第一列是电影ID,其余列是每个用户对该电影的评分,我执行以下操作:
val ratingsPerMovieDF = imdbRatingsDF
.groupBy("imdbId")
.pivot("userId")
.max("rating")
现在,我在这里得到一个DataFrame,其中大多数值是null,因为大多数用户只评价了几部电影。
我有兴趣计算这些电影之间的相似度(基于项目的协同过滤)。
我试图使用评级列值组装RowMatrix(使用 mllib 进行进一步的相似性计算)。但是,我不知道如何处理null 值。
下面的代码我尝试为每一行获取一个向量:
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,但这会产生不正确的相关结果,因为几乎所有向量都会变得非常相似。
谁能建议在这种情况下该怎么做?这里的最终目标是计算行之间的相关性。我正在考虑以某种方式使用SparseVectors(忽略null 值,但我不知道如何。
我是 Spark 和 Scala 的新手,所以其中一些可能没有什么意义。我正在努力更好地理解事情。
【问题讨论】:
标签: scala apache-spark machine-learning apache-spark-mllib imputation