【问题标题】:How to group top item from a JavaRDD without using Spark SQL?如何在不使用 Spark SQL 的情况下对 JavaRDD 中的顶级项目进行分组?
【发布时间】:2018-04-09 20:33:58
【问题描述】:

我有 JavaRDD,其中包含 userId、movieId 和他们的评分,就像这样。

Rating [userId=1, movieId=2858, rating=4.0], Rating [userId=3, movieId=2858, rating=5.0], Rating [userId=12, movieId=2658, rating=5.0].

我想根据观看次数找出前 5 部电影。我尝试使用谷歌搜索,但无法了解如何在 JavaRDD 中对 movieId 和 userId 进行分组。我想计算有多少用户观看了一部电影并将其存储到地图中为Map(movieId, num_of_user)。我是 apache spark 的新手。

期望的输出:

2858 - 2

2658 - 1

如果有任何类似的示例/链接/教程在 JavaRDD 上执行类似的操作,我将不胜感激。

更新:我发现了基于 question 的类似 scala。有人可以看看,将scala代码转换为java代码。

提前致谢。

【问题讨论】:

    标签: java scala apache-spark rdd


    【解决方案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|
    +-------+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2012-02-12
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多