提问者:小点点

如何组顶部项目从JavaRDD不使用火花SQL?


我有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代码吗?

提前感谢。


共1个答案

匿名用户

添加示例,您可以使用以下模板构建您的逻辑

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|
+-------+-----+