电影推荐系统-[离线统计部分](二)创建Package、类+编写代码

创建两个类-实际实现类、调用类

1)统计评分最多的电影

将上一个子项目(数据库+搜索服务器部分)中的Modle类拷贝过来

package staticRecommender

/**
  * @Author : ASUS and xinrong
  * @Version : 2020/9/4
  *  数据格式转换类
  *  ---------------电影表------------------------
  *  1
  *  Toy Story (1995)
  *
  *  81 minutes
  *  March 20, 2001
  *  1995
  *  English
  *  Adventure|Animation|Children|Comedy|Fantasy
  *  Tom Hanks|Tim Allen|Don Rickles|Jim Varney|Wallace Shawn|John Ratzenberger|Annie Potts|John Morris|Erik von Detten|Laurie Metcalf|R. Lee Ermey|Sarah Freeman|Penn Jillette|Tom Hanks|Tim Allen|Don Rickles|Jim Varney|Wallace Shawn
  *  John Lasseter
  */
case class Movie(val mid:Int,val name:String,val descri:String,
                 val timelong:String,val cal_issue:String,val shoot:String,
                 val language:String,val genres :String,val actors:String,val directors:String)
/**
  * -----用户对电影的评分数据集--------
  * 1,31,2.5,1260759144
  */
case class Rating(val uid:Int,val mid:Int,val score:Double,val timastamp:Int)

/**
  * --------用户对电影的标签数据集--------
  * 15,339,sandra 'boring' bullock,1138537770
  */
case class Tag(val uid:Int,val mid:Int,val tag:String,val timestamp:Int)

/**
  *
  * MongoDB配置对象
  * @param uri
  * @param db
  */
case class MongoConfig(val uri:String,val db:String)

/**
  * ES配置对象
  * @param httpHosts
  * @param transportHosts:保存的是所有ES节点的信息
  * @param clusterName
  */
case class EsConfig(val httpHosts:String,val transportHosts:String,val index:String,val clusterName:String)

Scala代码:

(1)实际实现类-StatisticsAlgorithm.scala

package staticRecommender

import org.apache.spark.sql.SparkSession

/**
  * @Author : ASUS and xinrong
  * @Version : 2020/9/18
  *         离线统计方法实现(存放所有离线统计实现代码)
  */
object StatisticsRecommender {

  //定义常见的表名
  val RATE_MORE_MOVIES="RateMoreMovies"
  val RATE_MORE_MOVIES_RECENTLY="RateMoreMoviesRecently"
  val AVERAGE_MOVIES_SCORE="AverageMoviesScore"
  val GENRES_TOP_MOVIES="GenresTopMovies"

  //一、统计评分最多的电影
  //注意:没有取前几个,所以直接统计出来就好
  def rateMore(spark:SparkSession)(implicit mongoConfig:MongoConfig):Unit={
    val rateMoreDF = spark.sql("select mid,count(1) as count from ratings group by mid order by count desc")
    //将统计好的写出去
    rateMoreDF.write
      .option("uri",mongoConfig.uri)
      .option("collection",RATE_MORE_MOVIES)
      .mode("overwrite")
      .format("com.mongodb.spark.sql")
      .save()
  }
}

(2)调用类-StatisticsApp.scala

package staticRecommender

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

/**
  * @Author : ASUS and xinrong
  * @Version : 2020/9/18
  *         离线统计的main方法(只负责调用方法类)
  *         在工作中也是这样的,将入口程序和实现的程序分开,以免混淆
  *
  *         一、数据流程
  *         spark读取MongoDB中的数据,进行离线统计后再将结果写入MongoDB中
  *         二、统计值
  *         1.评分最多电影:
  *          获取所在历史数据中,评分个数最多的电影的集合,统计每个电影评分个数 -->存入的MongoDB表名:RateMoreMovies
  *         2.近期热门电影:
  *          按照月来统计,这个月中,评分最多的电影我们认为是热门电影,统计每个月中每个电影的评分总量 -->RateMoreRecentlyMovies
  *         3.电影平均得分
  *          把每个电影所有的用户得分进行平均,计算出每个电影的平均得分--> AverageMovies
  *         4.每种类别电影的Top10
  *          首先,将每种类别的电影中评分最高的10个电影拿出来-->GenresTopMovies
  *          注意:一个电影可能属于多个类别,而且他的结果还依赖于 3 的结果
  */
object StatisticsApp extends App {
  //声明表
  val RATING_COLLECTION_NAME="Rating"
  val MOVIE_COLLECTION_NAME="Movie"

  //一、创建运行时的环境
  val params=scala.collection.mutable.Map[String,Any]()
    //保证CPU的核数大于等于2,"local[2]"表示开启两个线程
    //一个线程用于读取数据,一个线程用于计算处理数据
  params +="spark.cores"->"local[2]"
  params+="mongo.uri"->"mongodb://192.168.212.21:27017/recom"
  params+="mongo.db"->"recom"
  //spark环境
  val conf=new SparkConf().setAppName("StatisticsApp").setMaster(params("spark.cores").asInstanceOf[String])
  val spark= SparkSession.builder().config(conf).getOrCreate()

  //二、初始化MongoDB对象
    //传入uri,String类型
    //之所以定义成隐式参数,是想便于后面的方法去调用
  implicit val mongoConfig=new MongoConfig(params("mongo.uri").asInstanceOf[String],params("mongo.db").asInstanceOf[String])

  //三、读表
    // 1.读取mongoDB中的数据-ratings表的
  import spark.implicits._
  val ratings= spark
.read .option(
"uri", mongoConfig.uri) .option("collection",RATING_COLLECTION_NAME) //要读的表名 .format("com.mongodb.spark.sql") .load() .as[Rating] //将DataFrame转换成DataSet,这样便于执行RDD操作,参考:https://www.cnblogs.com/liuxinrong/articles/13341784.html .cache() //将其随手存入缓存 //四、将读到的数据信息注册成临时的视图 ratings.createOrReplaceTempView("ratings") //五、统计评分最多的电影 StatisticsRecommender.rateMore(spark) //六、随手关闭 ratings.unpersist() spark.close() }

启动MongoDB

[root@tjx1 mongodb-linux-x86_64-rhel62-3.4.3]# ./bin/mongod --config ./data/mongodb.conf

然后用Robo工具连接

执行代码之后查看Robo工具

 

 

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3