object Movie_Users_Analyzer_RDD { Logger.getLogger("org").setLevel(Level.ERROR); var masterUrl = "local[4]" var dataPath = "E:\\work_node\\资料\\spark_data\\ml-1m\\" //数据存放的目录 def main(args: Array[String]): Unit = { if(args.length>0){ masterUrl = args(0) }else if(args.length>1){ dataPath = args(1) } val sc = new SparkContext(new SparkConf().setMaster(masterUrl).setAppName("Movie_Users_Analyzer")) val usersRDD = sc.textFile(dataPath+"users.dat") val moviesRDD = sc.textFile(dataPath+"movies.dat") val occupationsRDD= sc.textFile(dataPath+"occupations.dat") val ratingsRDD= sc.textFile(dataPath+"ratings.dat") /** * *电影 点评 系统 用户 行为 分析 之一: 分析 具体 某部 电影 观看 的 用户 信息, * 如 电影 ID 为 *1193 的 用户 信息( 用户 的 ID、 Age、 Gender、 Occupation) */ val usersBasic:RDD[(String,(String,String,String))] = usersRDD.map(_.split("::")).map{user=>( //UserID::Gender::Age::Occupation user(3),(user(0),user(1),user(2)) )} for (elem<- usersBasic.collect().take(2)){ println("usersBasicRDD (职业ID,(用户ID,性别,年龄)):"+elem) } val occupations:RDD[(String,String)] = occupationsRDD.map(_.split("::")).map(job=>(job(0),job(1))) for (elem <- occupations.collect().take(2)){ println("occupations (职业ID,职业名):"+elem) } val userInformation:RDD[(String,((String,String,String),String))] = usersBasic.join(occupations) userInformation.cache() for(elem<- userInformation.collect().take(2)){ println("userInformation (职业ID,(用户ID,性别,年龄),职业名):"+elem) } val targetMovie:RDD[(String,String)] = ratingsRDD.map(_.split("::")).map(x=>(x(0),x(1))).filter(_._2.equals("1193")) println("------") for (elem<-targetMovie.collect().take(2)){ println("targetMovie (用户ID,电影ID):"+elem) } val targetUsers:RDD[(String,((String,String,String),String))] = userInformation.map(x=>(x._2._1._1,x._2)) for(elem<-targetUsers.collect().take(2)){ println("targetUsers (用户ID,((用户ID,性别,年龄),职业名)):"+elem) } println("电影点评系统用户行为分析, 统计观看电影ID为 1193 的电影用户信息: 用户的 ID、 性别、 年龄、 职业名") val userInformationForSpecificMovie:RDD[(String,(String,((String,String,String),String)))] = targetMovie.join(targetUsers) for(elem<-userInformationForSpecificMovie.collect().take(10)){ println("userInformationForSpecificMovie (用户ID,(电影ID,(用户ID,性别,年龄),职业名)):"+elem) } println("-------------------------------------") println("所有电影中口碑最好的电影:") val ratings = ratingsRDD.map(_.split("::")).map(x=>(x(0),x(1),x(2))).cache() //格式化出电影ID和评分 ratings.map(x=>(x._2,(x._3.toDouble,1))) //格式化成K-V .reduceByKey((x,y)=>(x._1+y._1,x._2+y._2))//对 Value 进行 reduce 操作, 分别 得出 每部 电影 的 总的 评分 和 总的 点评 人数 .map(x=>(x._2._1.toDouble/x._2._2,x._1)) //求出电影的平均分 .sortByKey(false) //降序排序 .take(10) //取TOP10 .foreach(println) //循环输出 val male = "M" val famale = "F" val genderRatings = ratings.map(x=>(x._1,(x._1,x._2,x._3))).join(usersRDD.map(_.split("::")).map(x=>(x(0),x(1))).cache()) genderRatings.take(2).foreach(println) val maleFliteredRatings:RDD[(String,String,String)] = genderRatings.filter(x=>x._2._2.equals("M")).map(x=>x._2._1) val femaleFliteredRatings:RDD[(String,String,String)] = genderRatings.filter(x=>x._2._2.equals("F")).map(x=>x._2._1) println("所有电影中最受男性喜爱的电影Top10:") maleFliteredRatings.map(x=>(x._2,(x._3.toDouble,1))) //格式化成k-v值 .reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)) //对 Value 进行 reduce 操作, 分别 得出 每部 电影 的 总的 评分 和 总的 点评 人数 .map(x => (x._2._1.toDouble/x._2._2,x._1)) //求电影平均分 .sortByKey(false).take(10).foreach(println) //降序排序 println("所有电影中最受女性喜爱的电影Top10:") femaleFliteredRatings.map(x=>(x._2,(x._3.toDouble,1))) //格式化成k-v值 .reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)) //对 Value 进行 reduce 操作, 分别 得出 每部 电影 的 总的 评分 和 总的 点评 人数 .map(x => (x._2._1.toDouble/x._2._2,x._1)) //求电影平均分 .sortByKey(false).take(10).foreach(println) //降序排序
数据来源:https://grouplens.org/datasets/movielens/