【电影推荐系统】数据爬取、数据加载进MongoDB数据库

概览

本篇主要介绍数据来源、数据加载进数据库过程

1 数据获取

使用Scrapy爬取豆瓣电影数据,然后利用movielens数据集来造一份rating数据。

1.1 数据集获取

  • 数据集获取:选取movielens 数据集:movielens官网
  • 数据集包括:movies,ratings,tags文件

1.2 数据爬取

  • 使用scrapy+xpath爬取豆瓣电影数据,最后存入csv,命名为movie.csv
  • 对于爬取的数据进行预处理:包括字段选取、相关字符处理

1.3 数据转换

  • 由于缺少rating数据,因此我们使用movielens的rating文件来造一下评分数据。
  • movielens数据集movie文件一共2791条电影数据,因此我们直接截取爬取的movie.csv前2791条数据。
  • 直接用movielens的电影ID替换爬取movie.csv的电影ID,因此最后我们得到的电影数据也就有了对应的评分数据。
  • 最后,我们需要的只是两个文件:movie.csv,rating.csv

(1)Movie数据

数据表格式为:
mid,title,desc,minute,year,year,language,geners,actors,director

(2)Rating数据

userID,mid,score,timestamp

2 将数据加载进MongoDB数据库

我们选择MongoDB数据库的原因如下:

  • 千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出
  • 可以进行深度查询

接下来,我们在云服务器部署MongoDB,主机远程连接数据库,将文件加载进数据库中。

2.1 MongoDB安装

  • 安装教程:linux安装MongoDB

2.2 maven依赖

maven相关依赖版本如下

注意:Spark版本和Spark集群的版本需要一致

  • scala:2.11.8
  • Spark:2.3.0

image.png

<properties><scala.version>2.11.8</scala.version>
</properties><dependencies><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>${scala.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><version>2.3.0</version></dependency>
</dependencies>

2.3 数据加载的程序

// 加载数据主程序
object DataLoader {val MONGODB_MOVIE_COLLECTION = "Movie"val MONGODB_RATING_COLLECTION = "Rating"val mgo_host = "root"val config = Map("spark.cores" -> "local[*]","mongo.uri" -> "mongodb://root:123456@服务器公网IP:27017/recommender","mongo.db" -> "recommender")// 文件位置val MOVIE_DATA_PATH = "F:\\1-project\\offline\\src\\main\\resources\\file\\movie.csv"val RATING_DATA_PATH = "F:\\1-project\\offline\\src\\main\\resources\\file\\ratings.csv"def main(args: Array[String]): Unit = {val sparkConf = new SparkConf().setMaster(config("spark.cores")).setAppName("DataLoader")val spark = SparkSession.builder().config(sparkConf).getOrCreate()import spark.implicits._val movieRDD = spark.sparkContext.textFile(MOVIE_DATA_PATH)  // 加载数据// 转为dfval movieDF = movieRDD.map(item => {val attr = item.split(",")Movie(attr(0).toInt, attr(1).trim, attr(2).trim, attr(3).trim, attr(4).trim, attr(5).trim, attr(6).trim, attr(7).trim, attr(8).trim)}).toDF()val ratingRDD = spark.sparkContext.textFile(RATING_DATA_PATH)val ratingDF = ratingRDD.map(item => {val attr = item.split(",")Rating(attr(0).toInt,attr(1).toInt,attr(2).toDouble,attr(3).toInt)}).toDF()implicit val mongoConfig = MongoConfig(config("mongo.uri"), config("mongo.db"))// 将数据保存到MongoDBstoreDataInMongoDB(movieDF, ratingDF)spark.stop()}}
def storeDataInMongoDB(movieDF: DataFrame, ratingDF: DataFrame)(implicit mongoConfig: MongoConfig): Unit ={// 新建一个mongodb的连接val mongoClient = MongoClient(MongoClientURI(mongoConfig.uri))// 将DF数据写入对应的mongodb表中movieDF.write.option("uri", mongoConfig.uri).option("collection", MONGODB_MOVIE_COLLECTION).mode("overwrite").format("com.mongodb.spark.sql").save()ratingDF.write.option("uri", mongoConfig.uri).option("collection", MONGODB_RATING_COLLECTION).mode("overwrite").format("com.mongodb.spark.sql").save()//对数据表建索引mongoClient(mongoConfig.db)(MONGODB_MOVIE_COLLECTION).createIndex(MongoDBObject("mid" -> 1))mongoClient(mongoConfig.db)(MONGODB_RATING_COLLECTION).createIndex(MongoDBObject("uid" -> 1))mongoClient(mongoConfig.db)(MONGODB_RATING_COLLECTION).createIndex(MongoDBObject("mid" -> 1))mongoClient.close()}

2.4 查看数据

  • 使用软件Mongo Management studio查看是否成功

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据挖掘torch】 基于LSTM电力系统负荷预测分析(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Istio 安全 授权管理AuthorizationPolicy

这个和cka考试里面的网络策略是类似的。它是可以实现更加细颗粒度限制的。 本质其实就是设置谁可以访问&#xff0c;谁不可以访问。默认命名空间是没有AuthorizationPolicy---允许所有的客户端访问。 这里是没有指定应用到谁上面去&#xff0c;有没有指定使用哪些客户端&#…

SE-Net注意力机制

📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…

12-3_Qt 5.9 C++开发指南_创建和使用静态链接库

第12章中的静态链接库和动态链接库介绍&#xff0c;都是以UI操作的方式进行&#xff0c;真正在实践中&#xff0c;可以参考UI操作产生的代码来实现同样的功能。 文章目录 1. 创建静态链接库1.1 创建静态链接库过程1.2 静态链接库代码1.2.1 静态链接库可视化UI设计框架1.2.2 qw…

Netty3 和Netty4区别

Netty3 和Netty4区别 目录概述需求&#xff1a; 设计思路实现思路分析1.Netty3和Netty4区别2.demo 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better resul…

【华为OD机试】荒岛求生【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生, 有的人往右逃生,有的往左逃生,如果两个人相遇,则PK,体力值大的能够打赢体力值小的, …

Java学习资料的推荐

以下是一些Java学习资料的推荐&#xff1a; 1. Java入门教程&#xff1a;https://www.runoob.com/java/java-tutorial.html 2. 阿里巴巴Java开发手册&#xff1a;https://github.com/alibaba/p3c/blob/master/README_zh_CN.md 3. Java编程思想&#xff08;Thinking in Java&…

SLA探活工具EaseProbe

工具介绍 EaseProbe可以做三种工作&#xff1a;探测、通知和报告。 项目地址&#xff1a;https://github.com/megaease/easeprobe 1、安装 [rootlocalhost ]# yum -y install unzip go [rootlocalhost ]# unzip easeprobe-main.zip [rootlocalhost ]# cd easeprobe-main [r…

数据结构--算法的时间复杂度和空间复杂度

文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法执行速度和资源利用情况的重要指标。 例子&#xff1a; long long Fib(int N) {if(N …

linux的内嵌汇编代码

/* C语言实现MCR指令 */ #define __STRINGIFY(x) #x #define __MCR(coproc, opcode_1, src, CRn, CRm, opcode_2) \ __ASM volatile ("MCR " __STRINGIFY(p##coproc) ", " __STRINGIFY(opcode_1) ", " \ "%0, &…

Mybatis

文章目录 MyBatis1、概述1.2、特性1.3、安装1.4、对比 2、搭建Mybatis2.1、创建一个Maven项目2.2、然后使用project structure确定java版本2.3、setting>build->build tools>maven&#xff0c;配置maven仓库、镜像、目录2.4、设置打包方式&#xff08;子模组&#xff…

MySQL的备份与还原

MySQL的备份与还原 1、MySQL的备份说明 热备&#xff1a; 在数据库正在运行下进行备份&#xff0c;备份期间&#xff0c;数据库读写均可以正常进行&#xff1b; 温备&#xff1a; 数据库可用性弱于热备&#xff0c;备份期间&#xff0c;数据库只能进行读操作&#xff0c;不…

hcip——BGP实验

要求 1.搭建toop 2.地址规划 路由器AS接口地址R11 loop0:1.1.1.1 24 loop1 : 192.168.1.1 24 g0/0/0 12.0.0.1 24 R22 64512 g0/0/0: 12.0.0.2 24 g/0/01: 172.16.0.2 19 g0/0/2: 172.16.96.2 19 R32 64512g0/0/0: 172.16.0.3 19 g0/0/1:1…

版本兼容问题——C++ 字符串库(std::basic_string::stoi)

软件开发过程中经常会存在版本更迭问题,对于如何做好版本之间的兼容性,相信也是八仙过海,各有神通。 那么,当我们确定了一个版本,怎么比较版本之间的差异呢? 且看如下代码: int CompareVersion(const std::string& strCurVersion, const std::string& strHis…

Linux systemctl命令详解

systemctl是Linux中用于管理系统服务&#xff08;例如防火墙等&#xff09;的命令行工具。它是一个功能强大的工具&#xff0c;可以启动、停止、重启、查看状态、启用或禁用系统服务&#xff0c;以及管理系统的单元&#xff08;units&#xff09;和套接字&#xff08;sockets&a…

chrome扩展控制popup页面动态切换

文章目录 1、通过控制元素的显示隐藏达到popup页面切换的效果2、通过监听页面重新加载完成不同popup的切换3、直接修改popup页面location.href&#xff0c;无需刷新页面 1、通过控制元素的显示隐藏达到popup页面切换的效果 下面在mv2版本的API下完成 实际上通过控制页面元素实…

【密码学】五、序列密码

序列密码 1、概述1.1序列密码的分类1.1.1同步序列密码1.1.2自同步序列密码 2、序列密码的组成2.1密钥序列生成器KG2.2有限状态自动机 3、LFSR 1、概述 采用一个短的种子密钥来控制某种算法获得长的密钥序列的办法&#xff0c;用以提供加解密&#xff0c;这个种子密钥的长度较短…

Qt 5. QSerialPort串口收发

1. 代码 //ex2.cpp #include "ex2.h" #include "ui_ex2.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>int static cnt 0;Ex2::Ex2(QWidget *parent): QDialog(parent), ui(new Ui::Ex2) {ui->setupUi…

写Acknowledgement的时候,latex日志出现警告

用latex写论文的时候&#xff0c;\section{Conclusion}下面添加 \backmatter \bmhead{Acknowledgments}时报错&#xff1a;错误log&#xff1a; \bmhead Package hyperref Warning: Difference (4) between bookmark levels is greater than one, level....错误原因&#xff…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文,风格迁移,实战

代码&#xff1a;https://github.com/zyxElsa/InST 论文&#xff1a;https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…