题目所需数据集及相应信息描述:
数据集:
1、用户评分数据集ratings.dat:包含了大量用户的历史评分数据。
2、样本评分数据集personalRatings.dat:包含了少数几个用户的个性化评分数据,这些数据反映了某个用户的个性化观影喜好。
3、电影数据集movies.dat:包含了每部电影的相关信息。
注意:
之后依次使用数据集1~3表示上述数据集
数据集结构如下:
1、用户ID::电影ID::评分::时间戳
2、用户ID::电影ID::评分::时间戳
3、电影ID::电影名称::电影类型

(1)movies.dat数据集部分展示:

(2)ratings.dat数据集部分展示:

题目要求:
1、根据数据集3,计算每年发行电影的数量,并进行可视化(柱状图)。
2、根据数据集1,计算每部电影的平均分,并进行可视化(柱状图)。
3、根据数据集1,将电影评分离散化,[0,2)为差,[2-4)为良好,[4-5)为优秀,并进行可视化(饼图)。
4、根据数据集3,统计每种类型电影的数量(若一个电影有多个分类,选择第一个),并进行可视化(饼图)。
5、根据数据集1、2,自行挑选用户(用户id),使用协同过滤算法为其推荐十部电影,无需可视化,只需运行结果。

实验思路及代码:

(1)第一小题思路(流程图)

代码:

//计算每年发行电影的数量val rdd1 = sc.textFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/movies.txt")
//先将每行元素按照::进行分割,然后取出包含年份的那个字段val rdd2 = rdd1.map(line=>line.split("::")(1))
//获取年份(使用两次反转)val rdd3 = rdd2.map(line=>line.reverse.take(5))val rdd4 = rdd3.map(line=>line.reverse.take(4))
//计算每年发行电影的数量
val rdd_result = rdd4.map(word=>(word,1)).reduceByKey(_+_)
//进行格式化
val rdd_show = rdd_result.map(line=>line._1+"年,有"+line._2+"份电影")
//将结果输出到文件夹当中
rdd_show.saveAsTextFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/Test1")

结果展示:

(2)第二小题思路

代码:

//提取每个电影以及对应的评分,形成一个元组
val rdd3_2 = rdd3_1.map(line=>(line.split("::")(1),line.split("::")(2).toInt))
//对应rdd3_2的value进行操作,key不动
val rdd3_3 = rdd3_2.mapValues(x=>(x,1))
//将相同的电影的评分进行求平均
val rdd3_4 = rdd3_3.reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).mapValues(x=>x._1/x._2)
//将结果进行保存
rdd3_4.saveAsTextFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/Test3")

结果展示:

(3)第三小题思路

代码:

//读取数据
val rdd2_1 = sc.textFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/ratings.txt")
//获取评分
val rdd2_2 = rdd2_1.map(line=>line.split("::")(2))
//将评分转化为整数
val rdd2_3 = rdd2_2.map(line=>line.toInt)
//对评分进行离散化
val rdd2_4 = rdd2_3.map(line=>if (line>=0&&line<2) "差" else if(line>=2&&line<4) "良好" else if(line>=4&&line<=5) "优秀")
//将结果进行统计val rdd2_5 = rdd2_4.map(line=>(line,1)).reduceByKey(_+_)
//将结果进行展示
rdd2_5.foreach(println)

结果展示:

(4)第四小题思路:

代码:

//对movies数据集进行读取
val rdd4_1 = sc.textFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/movies.txt")
//转换成只包含类型数据的RDDval rdd4_2 = rdd4_1.map(line=>line.split("::")(2))
//当遇到一个电影有多个类型的时候只选取其中第一个类型
val rdd4_3 = rdd4_2.map(line=>line.split(",")(0))
//统计每种类型电影的数量val rdd4_4 = rdd4_3.map(line=>(line,1)).reduceByKey(_+_)
//将数据保存rdd4_4.saveAsTextFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/Test4")

结果展示:

(5)第五小题思路:

代码:

//导入文件生成RDD
val rdd5_1 = sc.textFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/ratings.txt"
)
//定义样例类,用来隐式转换
case class Rating(userId:Int,movieId:Int,rating:Float,timestamp:Long)
//反射机制推断RDD来生成DataFrame
val rdd5_2 = rdd5_1.map(line=>Rating(line.split("::")(0).toInt,line.split("::")(1).toInt,line.split("::")(2).toFloat,line.split("::")(3).toLong)).toDF()
//将数据集按4:1划分成训练集和测试集
val Array(train,test) = rdd5_2.randomSplit(Array(0.8,0.2))
//创建model
val model = new ALS().setMaxIter(10).setRegParam(0.03).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")
//训练生成模型
val train_model = model.fit(train)
//模型进行测试
val test_rdd = train_model.transform(test)
//注册为临时表
test_rdd.createOrReplaceTempView("result")
//查找用户id为1的
val result_rdd = spark.sql("select userId,movieId,prediction as rating from result where userId=1")
//按照rating进行降序排列
result_rdd.sort(result_rdd("rating").desc).show()
//读取movies文件val movie_rdd = sc.textFile("C:/Users/ch/Desktop/大学/大三阶段/spark/spark实验/课程设计/题目/实验数据集/movies.tx
t")
//创建样例类进行隐式转换case class Movie(movieId:Int,name:String,movieType:String)
val movie_DF = movie_rdd.map(line=>Movie(line.split("::")(0).toInt,line.split("::")(1),line.split("::")(2))).toDF()
//将用户表进行注册
val user_movie = result_rdd.sort(result_rdd("rating").desc)
//注册为临时表
movie_DF.createOrReplaceTempView("movie")
user_movie.createOrReplaceTempView("user")
//两张表进行关联
scala> val result = spark.sql("select movieId,name from movie where movieId = 1287 or movieId=1035 or movieId=3105 or movieId=2355 or movieId=150 or movieId=1 or movieId=1961 or movieId=1028 or movieId=1029 or movieId=1270")
//结果展示(为用户1推荐的电影)
result.map(line=>"MovieId:"+line(0)+","+"MovieName:"+line(1)).show()
result.map(line=>"MovieName:"+line(1)).show()
result.show()

结果展示:

Spark课程设计——电影推荐系统相关推荐

  1. c语言课程设计电影选座,C语言课程设计电影院座位分配(1).doc

    PAGE .. .. 电影院座位分配 一.目的 通过课程设计,加深对<C语言程序设计>课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形.实型.字符型.指针 ...

  2. 基于Spark平台的协同过滤实时电影推荐系统

    文章目录 摘要 0 引言 1 协同过滤算法 2 实时推荐服务 3 电影推荐系统设计部署 3.1 架构设计 3.2 系统功能设计 3.3 数据库设计 4 系统运行效果 5 结语 参考文献 摘要 摘要:随 ...

  3. springboot基于JAVA的电影推荐系统的开发与实现毕业设计源码112306

    目    录 摘要 Abstract 第1章前言 1.1研究背景 1.2研究现状 1.3系统开发目标 第2章技术与原理 2.1  JSP介绍 2.2  JAVA技术 2.3  MySQL数据库 2.4 ...

  4. (附源码)springboot基于JAVA的电影推荐系统的开发与实现 毕业设计112306

    目 录 摘 要 4 Abstract 5 第1章 前 言 6 1.1 研究背景 6 1.2 研究现状 6 1.3 系统开发目标 6 第2章 技术与原理 8 2.1 JSP介绍 8 2.2 JAVA技术 ...

  5. springboot基于JAVA的电影推荐系统的开发与实现 附源码-毕业设计112306

    目    录 摘要 4 Abstract 5 第1章前言 6 1.1研究背景 6 1.2研究现状 6 1.3系统开发目标 6 第2章技术与原理 8 2.1  JSP介绍 8 2.2  JAVA技术 8 ...

  6. 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  7. 基于Spark的电影推荐系统(电影网站)

    第一部分-电影网站: 软件架构: SpringBoot+Mybatis+JSP 项目描述:主要实现电影网站的展现 和 用户的所有动作的地方 技术选型: 技术 名称 官网 Spring Boot 容器 ...

  8. Springboot就业推荐系统qwy6c计算机毕业设计-课程设计-期末作业-毕设程序代做

    Springboot就业推荐系统qwy6c计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot就业推荐系统qwy6c计算机毕业设计-课程设计-期末作业-毕设程序代做 ...

  9. 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  10. 基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

最新文章

  1. java结构化语言,如何让Java代码流畅和结构化
  2. 为什么数字中台是企业应用新基建?
  3. 沟通CTBS V5.0发布, 南北通及安全性成最大亮点
  4. JAVA多线程之男朋友和女朋友之间的故事
  5. 西安工程大学计算机是几本专业,2016年西安工程大学计算机科学与技术(卓越班)专业在陕西录取分数线...
  6. c html 转 pdf,HTML 转 PDF
  7. springboot+1、图片上传到本地路径信息保存在数据库2、根据id删除本地图片
  8. Xshell6下载安装
  9. iOS 一种连线题效果的实现
  10. 解决Win键不能用的问题
  11. 洛谷P1512 伊甸园日历游戏
  12. 文件管理服务器win7,Win7如何取得文件管理所有权
  13. 开发调试指令大全--(博通开发调试命令)
  14. Qt实现页面跳转与返回上一级页面(Qt+VS2019)
  15. VUE div click无效
  16. 2-2 第17次课 高项之人力资源管理
  17. Format函数的用法
  18. IDEA导入项目无法识别
  19. 自监督学习、半监督学习、弱监督学习
  20. (三)独立集、支配集及匹配——图论笔记系列

热门文章

  1. 几个主要软件调试方法及调试原则
  2. 用计算python两点之间的距离math_Python求两点之间的直线距离(2种实现方法)
  3. 精灵图,雪碧图的应用
  4. ArcGIS转CAD坐标
  5. c#访问其他服务器的共享文件夹,C#实现访问网络共享文件夹
  6. DataX同步离线数据基础使用教程
  7. 混沌数学之Henon吸引子
  8. 如何去除win 10右键菜单的“使用skype共享”
  9. 【5G系列】Network Slicing学习总结(4)
  10. pytorch tensor索引、切片、连接——Indexing, Slicing, Joining