在上一篇我们已经学习了前五个需求如何实现,现在看看后五个。
需求六
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(