我有JavaRDD,其中包含userId、movieId和它们的评级,如下所示。
评分[userId=1, movieId=2858,评分=4.0],评分[userId=3,movieId=2858,评分=5.0],评分[userId=12,movieId=2658,评分=5.0]
。
我想根据观看次数找到前5部电影。我尝试了谷歌搜索,但无法了解如何在JavaRDD中对movieId和userId进行分组。我想计算有多少用户观看了一部电影并将其存储到Map中作为Map(movieId,num_of_user)
。我是apache park的新手。
期望输出:
2858 - 2
2658 - 1
我将感谢任何类似的示例/链接/教程来在JavaRDD上执行类似的操作。
更新:我发现了类似scala问题。有人能看看并将scala代码转换为java代码吗?
提前感谢。
添加示例,您可以使用以下模板构建您的逻辑
case class Rating(userId: Long, movieId: Long,rating:Long)
val RatingDF = List(
Rating(1, 2858,4),
Rating(3, 2858,5),
Rating(12,2658,5)
).toDF()
RatingDF.show()
//using non sql approch
import org.apache.spark.sql.functions._
val topMovieIDs =
RatingDF.groupBy("movieId").count().orderBy(desc("count")).cache()
topMovieIDs.show()
结果:
+------+-------+------+
|userId|movieId|rating|
+------+-------+------+
| 1| 2858| 4|
| 3| 2858| 5|
| 12| 2658| 5|
+------+-------+------+
+-------+-----+
|movieId|count|
+-------+-----+
| 2858| 2|
| 2658| 1|
+-------+-----+