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

统计近期(按月份)评分最多的电影

Scala代码:

(1)实际实现类

//二、统计近期热门电影
def rateMoreRecently(spark:SparkSession)(implicit mongoConfig: MongoConfig):Unit={
  /**
    * UDF--修改日期格式
    * 将数据中的长整形-1260759114 转化成" 201912"
    */
  val simpleDateFormat=new SimpleDateFormat("yyyyMM")
//建议使用这种写法(JDK 1.8版本以上新升级的):
//val simpleDateFormat=DateTimeFormatter.ofPattern("yyyyMM")
//下面这行最后的转长整形(.toLong)是可有可无的, x*1000L是为了将时间精确到毫秒 spark.udf.register("changeDate",(x:Long)=>simpleDateFormat.format(new Date(x*1000L)).toLong) val yearMonthOfRatings=spark.sql("select mid,uid,score,changeDate(timastamp) as yearmonth from ratings") //将读到的数据注册成临时的视图 yearMonthOfRatings.createOrReplaceTempView("ymRatings") //group by 月份和mid //排序的时候是按照月份和个数的降序 spark.sql("select mid,count(1) as count,yearmonth from ymRatings group by yearmonth,mid order by yearmonth desc,count desc") .write .option("uri",mongoConfig.uri) .option("collection",RATE_MORE_MOVIES_RECENTLY) .mode("overwrite") .format("com.mongodb.spark.sql") .save() }

(2)调用类

//六、统计近期热门电影
StatisticsRecommender.rateMoreRecently(spark)

启动MongoDB、执行程序并查看Robo工具

 

 部分代码解释:

时间戳*1000L的含义:

 

 

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