【电影推荐系统】数据爬取、数据加载进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…

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 …

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…

【密码学】五、序列密码

序列密码 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…

【深度学习】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…

Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

android 如何分析应用的内存(十四)——jdb命令行

android 如何分析应用的内存&#xff08;十四&#xff09; 前面的系列文章介绍了android应用如何分析native内存。 接下来就是android应用如何分析java内存。同native一样&#xff0c;我们也希望能够看到 ART的堆和栈的情况&#xff0c;以及锁的情况&#xff0c;方法的本地变…

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

Docker安装es以及ik分词器

1、拉取镜像 docker pull elasticsearch:7.10.12、下载对应版本的ik分词、并将它们解压到ik文件夹下&#xff0c;如图 https://github.com/medcl/elasticsearch-analysis-ik/releases 3、在服务器上创建文件夹 mkdir /usr/elklog/elk/es mkdir /usr/elklog/elk/es/data mkdi…

Web3教程| 如何发现并追踪“聪明钱”?

在加密领域&#xff0c;聪明钱&#xff08;Smart Money&#xff09;是指拥有专业知识、对市场有深入了解以及具有信息优势的专业投资机构或个人投资者。 聪明钱一直以来都是加密市场中的关注焦点&#xff0c;因为这些实体通常可以获得普通交易者不易获得的信息和资源&#xff0…

【Web开发指南】如何用MyEclipse进行JavaScript开发?

由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性&#xff0c;进行JavaScript编码不再是一项繁琐的任务。 MyEclipse v2023.1.2离线版下载 JavaScript项目 在MyEclipse 2021及以后的版本中&#xff0c;大多数JavaScript支持都是开箱即用的JavaScript源代码…

【运维】hive 终端突然不能使用:Hive Schema version does not match metastore‘s schema version

文章目录 一. 问题描述二. 常规排查1. 元数据库2. hive-site.xml相关meta连接信息检查 三. 正解 一. 问题描述 进入hive终端&#xff0c;执行如下命令报错&#xff1a; hive> show tables; FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: …

冒泡排序算法

冒泡排序 算法说明与代码实现&#xff1a; 简单分析&#xff0c;外循环次数为数据len(arr)-1次&#xff0c;内循环为len(arr)-外循环次数 下面是使用Go语言实现冒泡排序算法的示例&#xff1a; package mainimport "fmt"func bubbleSort(arr []int) {n : len(arr…