Spark影评数据分析三

本文继续探讨Spark影评数据分析,涵盖需求六至需求十。在需求九中,面对18种电影类型的评分统计,作者通过groupBy解决复杂运算。在遇到RDD join问题时,了解到只有键值对形式的RDD才能进行join操作。
摘要由CSDN通过智能技术生成

上一篇我们已经学习了前五个需求如何实现,现在看看后五个。

需求六

package movie
import org.apache.spark.rdd.RDD

//求最喜欢看电影(影评次数最多)的那位女性评最高分的 10 部电影的平均影评分(观影者,电影名,影评分)
object Demand06 {
   
  def main(args: Array[String]): Unit = {
   
    val utils = new Utils
    //(userID,rateTimes)
    val userID_rating = utils.ratingsRdd.map(x=>(x._1,1))   //(userID,1)
      .groupByKey()   //(userID,1,1,1...)
      .map(x=>(x._1,x._2.size) )  //(userID,ratetimes)
    //(userID,sex)
    val userID_sex = utils.usersRdd.map(x=>(x._1,x._2))
    val userID_rating_sex = userID_rating.join(userID_sex)//(userID,(rateTimes,sex))
      .filter(x=>x._2._2=="F")//过滤出女性
      .map(x=>(x._1,x._2._1))
      .sortBy(x=>x._2,false)//按评分次数降序排序
      .take(1)
    println("喜欢看电影(影评次数最多)的那位女性的id和影评次数:")
    userID_rating_sex.foreach(println(_))//输出最喜欢看电影(影评次数最多)的那位女性的id和影评次数
    //这位女性的userID=1150
    val moviesID = utils.ratingsRdd.map(x=>(x._1,x._2,x._3))//(userID,movieID,rating)
      .filter(x=>(x._3=="5" && x._1=="1150"))
      .map(x=>x._2)
    //moviesID.foreach(println(_))//输出这位女性最评分为5的电影ID,接下来求这些电影的平均影评分
    val movieId_rating = utils.ratingsRdd.map(x=>(x._2,x._3.toInt))//(movieID,rating)
      .groupByKey()
      .map(x=>(x._1,x._2.sum*1.0/x._2.size))
    //movieId_rating.take(10).foreach(println(_)
    val result = utils.movieRdd.map(x=>(x._1,x._2))
      .join(movieId_rating)
      .map(x=>("1150",x._2._1,x._2._2))
    println("那位女性评最高分的 10 部电影的平均影评分")
    result.take(10).foreach(println(_))
  }
}

在这里插入图片描述

需求七

package movie
//求好片(评分>=4.0)最多的那个年份的最好看的 10 部电影
object Demand07 {
   
  def main(args: Array[String]): Unit = {
   
    val utils = new Utils
    //(movieID,year)
    val movieID_year = utils.movieRdd.map{
   x=>
      val s =x._2.lastIndexOf("(")
      val e=x._2.lastIndexOf(
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值