spark电影推荐系统的简单测试

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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值