获取平均评分最高的10部电影

package com.bj.scalacode

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

/**
  * 平均评分最高的10部电影
  */
object RDD_Movie_Users_Analyzer2 {
  def main(args: Array[String]): Unit = {
    var dataPath="F:\\baidu\\ml-1m"
    //配置SparkConf,这里指本地运行,并把程序的名字设置为RDD_Movie_Users_Analyzer2
    val conf=new SparkConf().setMaster("local[*]").setAppName("RDD_Movie_Users_Analyzer2")
    //Spark2.0 引入SparkSession 封装了SparkContext 和SQLContext ,并且会在
    //builder 的getOrCreate 方法中判断是否有符合要求的SparkSession 存在,有则使用,没有则进行创建
    val spark=SparkSession.builder().config(conf).getOrCreate()
    //获取SparkSession 的SparkContext
    val sc=spark.sparkContext
    //把Spark 程序运行时的日志设置为warn 级别,以方便查看运行结果
    sc.setLogLevel("warn")
    //把用到的数据加栽进来转换为RDD ,此时使用sc.textFile 并不会读取文件,而是标记了有这个操作,遇到Action 级别算子时才会真正去读取文件
    val usersRDD=sc.textFile(dataPath+"/users.dat")
    val moviesRDD=sc.textFile(dataPath+"/movies.dat")
    val ratingsRDD=sc.textFile(dataPath+"/ratings.dat")
    //具体的数据处理业务逻辑
    //打印出所有电影中评分最高的前10 个电影名和平均评分
    println("所有电影中评分最高(口碑最好)的前10个电影名和平均评分:")
    //第一步:
    //,从moviesRDD 中取出MovieID 和Name,如果后面的代码重复使用这些数据,则可以把它们缓存起来。
    // 首先把使用map 算子上面的RDD 中的每一个元素(即文件中的每一行)以"::" 为分隔符进行拆分,
    // 然后再使用map算子从拆分后得到的数组中取出需要用到的元素,并把得到的RDD 缓存起来。
    //取出MovieID 和Name
    val movieinfo = moviesRDD.map(x=>(x.split("::"))).map(x=>(x(0),x(1))).cache()
    //从ratingsRDD中取出UserID,MovieID 和rating
    val ratings = ratingsRDD.map(_.split("::")).map(x=>(x(0),x(1),x(2),x(3))).cache()
    //第二步:
    //从ratings 的数据中使用map 算子获取到形如(movieID,(rating,1)格式的RDD,
    //然后使用reduceByKey 把每个电影的总评分以及点评人数算出来。
    //ratings.map(x=>(x._1,x._2,x._3,x._4)).take(10).foreach(println)//(1,1193,5,978300760)
    //ratings.map(x=>(x._2,(x._3,1))).take(10).foreach(println)//(1193,(5,1))
    //此时得到的RDD 格式为(movieID,(Sum(ratings ),Count(ratings)))(1380,(2923.0,817))
    val moviesAndRatings = ratings.map(x => (x._2, (x._3.toDouble, 1)))
      .reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))//(2828,(255.0,121))
    //第三步:得到格式为(movieID,(Sum(ratings ),Count(ratings))),
    // 把每个电影的Sum(ratings)和 Count(ratings)相除,得到包含了电影ID 和平均评分的RDD:
    val avgRatings = moviesAndRatings.map(x=>(x._1,x._2._1.toDouble/x._2._2))
   // avgRatings.foreach(println)//得到包含了电影ID 和平均评分的RDD :(2834,3.5555555555555554)
    //第四步:把avgRatings 与movielnfo 通过关键字key(movieID)连接到一起,得到形如(movieID,(MovieName,AvgRating)) 的RDD ,
    // 然后格式化为( AvgRating,MovieName ),并按照key (也就是平均评分)降序排列,最终取出前10 个并打印出来。
    avgRatings.join(movieinfo).map(item=>(item._2._1,item._2._2))
        .sortByKey(false).take(10).foreach(record=>println(record._2+"平均评分为:"+record._1))

//    avgRatings.join(movieinfo).map(item=>(item._2._1,item._2._2)).take(1).foreach(println)
//    //(2.1074380165289255,Dudley Do-Right (1999))
//    println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
//    avgRatings.join(movieinfo).map(item=>(item._1,item._2,item._2._2,item._2._1)).take(1).foreach(println)
//    // (2828,(2.1074380165289255,Dudley Do-Right (1999)),Dudley Do-Right (1999),2.1074380165289255)
//    println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
//
//    avgRatings.take(1).foreach(println)
//    //(2828,2.1074380165289255)
//    println("#################################################################################")
//    movieinfo.take(1).foreach(println)
    //(1,Toy Story (1995))


    //最后关闭SparkSession
    sc.stop()
  }
}


所有电影中评分最高(口碑最好)的前10个电影名和平均评分:
Schlafes Bruder (Brother of Sleep) (1995)平均评分为:5.0
Gate of Heavenly Peace, The (1995)平均评分为:5.0
Lured (1947)平均评分为:5.0
Bittersweet Motel (2000)平均评分为:5.0
Follow the Bitch (1998)平均评分为:5.0
Song of Freedom (1936)平均评分为:5.0
One Little Indian (1973)平均评分为:5.0
Baby, The (1973)平均评分为:5.0
Smashing Time (1967)平均评分为:5.0
Ulysses (Ulisse) (1954)平均评分为:5.0

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值