文章目录

  • 一、在IDEA中创建maven项目
    • 1.项目框架搭建
    • 2.声明项目中工具的版本信息
    • 3.添加项目依赖
  • 二、数据加载准备
    • 1.Products数据集
    • 2.Ratings数据集
    • 3.日志管理配置文件
  • 三、数据初始化到MongoDB
    • 1.启动MongoDB数据库
    • 2.数据加载程序主体实现

  • 课程地址:尚硅谷大数据项目教程(大数据实战电商推荐系统)
  • 尚硅谷电商推荐系统的配套资料及虚拟机
    链接:https://pan.baidu.com/s/1iSMqV2wPkEfIsO1FrkxRNQ?pwd=1996
    提取码:1996
  • 1.项目体系架构设计(电商推荐系统)
  • 2.工具环境搭建(电商推荐系统)
  • 3.创建项目并初始化业务数据(电商推荐系统)
  • 4.离线推荐服务建设(电商推荐系统)
  • 5.实时推荐服务建设(电商推荐系统)
  • 6.冷启动问题处理(电商推荐系统)
  • 7.基于内容的相似推荐与基于物品的协同过滤推荐
  • 8.尚硅谷电商推荐系统预览

  我们的项目主体用Scala编写,采用IDEA作为开发环境进行项目编写,采用maven作为项目构建和管理工具。

一、在IDEA中创建maven项目

  打开IDEA,创建一个maven项目,命名为ECommerceRecommendSystem。为了方便后期的联调,我们会把业务系统的代码也添加进来,所以我们可以以ECommerceRecommendSystem作为父项目,并在其下建一个名为recommender的子项目,然后再在下面搭建多个子项目用于提供不同的推荐服务。

1.项目框架搭建

  在ECommerceRecommendSystem下新建一个 maven module作为子项目,命名为recommender。同样的,再以recommender为父项目,新建一个maven module作为子项目。我们的第一步是初始化业务数据,所以子项目命名为 DataLoader
  父项目只是为了规范化项目结构,方便依赖管理,本身是不需要代码实现的,所以ECommerceRecommendSystemrecommender下的src文件夹都可以删掉。
  目前的整体项目框架如下:

2.声明项目中工具的版本信息

  我们整个项目需要用到多个工具,它们的不同版本可能会对程序运行造成影响,所以应该在最外层的ECommerceRecommendSystem中声明所有子项目共用的版本信息。
  在pom.xml中加入以下配置:
ECommerceRecommendSystem/pom.xml

    <!--定义版本信息--><properties><!--log4j对日志的具体实现--><log4j.version>1.2.17</log4j.version><!--slf4j日志的简单接口--><slf4j.version>1.7.22</slf4j.version><!--mongodb-spark:mongodb与spark的连接器--><mongodb-spark.version>2.0.0</mongodb-spark.version><!--casbah:mongodb的一个scala上的driver--><casbah.version>3.1.1</casbah.version><redis.version>2.9.0</redis.version><kafka.version>0.10.2.1</kafka.version><spark.version>2.1.1</spark.version><scala.version>2.11.8</scala.version><!--jblas:java的线性代数的库--><jblas.version>1.2.1</jblas.version></properties>

3.添加项目依赖

  首先,对于整个项目而言,应该有同样的日志管理,我们在ECommerceRecommendSystem中引入公有依赖
ECommerceRecommendSystem/pom.xml

<dependencies><!-- 引入共同的日志管理工具 --><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency>
</dependencies>

  同样,对于maven项目的构建,可以引入公有的插件
ECommerceRecommendSystem/pom.xml

<build><!--声明并引入子项目共有的插件--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.1</version><!--所有的编译用JDK1.8--><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins><pluginManagement><plugins><!--maven的打包插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.0.0</version><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><!--该插件用于将scala代码编译成class文件--><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.2</version><executions><!--绑定到maven的编译阶段--><execution><goals><goal>compile</goal><goal>testCompile</goal></goals></execution></executions></plugin></plugins></pluginManagement>
</build>

  然后,在recommender模块中,我们可以为所有的推荐模块声明spark相关依赖(这里的dependencyManagement表示仅声明相关信息,子项目如果依赖需要自行引入):
ECommerceRecommendSystem/recommender/pom.xml

<dependencyManagement><dependencies><!-- 引入Spark相关的Jar包 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.11</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.11</artifactId><version>${spark.version}</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-graphx_2.11</artifactId><version>${spark.version}</version></dependency>
<dependency><groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency></dependencies>
</dependencyManagement>

  由于各推荐模块都是scala代码,还应该引入scala-maven-plugin插件,用于scala程序的编译。因为插件已经在父项目中声明,所以这里不需要再声明版本和具体配置:
ECommerceRecommendSystem/recommender/pom.xml

<build><plugins><!-- 父项目已声明该plugin,子项目在引入的时候,不用声明版本和已经声明的配置 --><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId></plugin></plugins>
</build>

  对于具体的DataLoader子项目,需要spark相关组件,还需要mongodb的相关依赖,我们在pom.xml文件中引入所有依赖(在父项目中已声明的不需要再加详细信息):
ECommerceRecommendSystem/recommender/DataLoader/pom.xml

<dependencies><!-- Spark的依赖引入 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId></dependency><!-- 引入Scala --><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId></dependency><!-- 加入MongoDB的驱动 --><dependency><groupId>org.mongodb</groupId><artifactId>casbah-core_2.11</artifactId><version>${casbah.version}</version></dependency><dependency><groupId>org.mongodb.spark</groupId><artifactId>mongo-spark-connector_2.11</artifactId><version>${mongodb-spark.version}</version></dependency>
</dependencies>

至此,我们做数据加载需要的依赖都已配置好,可以开始写代码了。

二、数据加载准备

  在src/main/目录下,可以看到已有的默认源文件目录是java,我们可以将其改名为scala。将数据文件products.csvratings.csv复制到资源文件目录src/main/resources下,我们将从这里读取数据并加载到mongodb中。

1.Products数据集

  数据格式:

productId name categoryIds amazonId imageUrl categories tags
3982 Fuhlen富勒 M8眩光舞者时尚节能无线鼠标(草绿)(眩光.悦动.时尚炫舞鼠标 12个月免换电池 高精度光学寻迹引擎 超细微接收器10米传输距离) 1057,439,736 B009EJN4T2 https://images-cn-4.ssl-images-amazon.com/images/I/31QPvUDNavL.SY300_QL70.jpg 外设产品|鼠标|电脑|办公 富勒|鼠标|电子产品|好用|外观漂亮

  Product数据集有7个字段,每个字段之间通过“^”符号进行分割。其中的categoryIdsamazonId对于内容特征没有实质帮助,我们只需要其它5个字段:

字段名 字段类型 字段描述 字段备注
productId Int 商品ID
name String 商品名称
categories String 商品分类 每一项用“|”分割
imageUrl String 商品图片URL
tags String 商品UGC标签 每一项用“|”分割

2.Ratings数据集

  数据格式:

userId prudcutId rating timestamp
4867 457976 5.0 1395676800

  Rating数据集有4个字段,每个字段之间通过“\,”分割。

字段名 字段类型 字段描述 字段备注
userId Int 用户ID
produtId Int 商品ID
score Double 评分值
timestamp Long 评分的时间

3.日志管理配置文件

  log4j对日志的管理,需要通过配置文件来生效。在src/main/resources下新建配置文件log4j.properties,写入以下内容:

log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}  %5p --- [%50t]  %-80c(line:%5L)  :  %m%n

三、数据初始化到MongoDB

1.启动MongoDB数据库

  具体内容可查看这个博客:Windows 10 安装与启动 MongoDB

2.数据加载程序主体实现

  我们会为原始数据定义几个样例类,通过SparkContexttextFile方法从文件中读取数据,并转换成DataFrame,再利用Spark SQL提供的write方法进行数据的分布式插入。
  在DataLoader/src/main/scala下新建package,命名为com.atguigu.recommender,新建名为DataLoaderscala class文件。

  程序主体代码如下:

package com.atguigu.recommenderimport com.mongodb.casbah.commons.MongoDBObject
import com.mongodb.casbah.{MongoClient, MongoClientURI, MongoCollection, MongoDB}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SparkSession}/*
*Product数据集
* 6797                               商品ID
* PHILIPS飞利浦HQ912/15两刀头充电式     商品名称
* 222,621,691                        商品分类ID,不需要
* B002TKLK0S                         亚马逊ID,不需要
* https://images-cn-4.ssl-images-a   商品的网址URI
* 家用电器|个人护理电器|电动剃须刀         商品的分类
* 飞利浦|剃须刀|家用电器|好用|外观漂亮     商品UGC标签
* *///定义样例类
case class Product(productId: Int, name: String, imageUri: String, categories: String, tags: String)
/*
* Rating数据集
* 4867     用户ID
* 457976   商品ID
* 5.0      评分
* 1395676800 时间戳
* *///定义样例类
case class Rating(userId: Int, productId: Int, score: Double, timestamp: Int)/*
* MongoDB连接配置
* uri:MongoDB连接的uri
* db:要操作的db
* */
//将mongodb封装成样例类
case class MongoConfig(uri: String, db: String)object DataLoader {//定义数据文件路径val PRODUCT_DATA_PATH = "D:\\IdeaProjects\\ECommerceRecommendSystem\\recommender\\DataLoader\\src\\main\\resources\\products.csv"val RATING_DATA_PATH = "D:\\IdeaProjects\\ECommerceRecommendSystem\\recommender\\DataLoader\\src\\main\\resources\\ratings.csv"//定义mongodb中存储的表名val MONGODB_PRODUCT_COLLECTION = "Product"val MONGODB_RATING_COLLECTION = "Rating"def main(args: Array[String]): Unit = {//配置信息val config: Map[String, String] = Map("spark.cores" -> "local[*]","mongo.uri" -> "mongodb://localhost:27017/recommender","mongo.db" -> "recommender")//构建sparkContext执行环境入口对象val conf: SparkConf = new SparkConf().setMaster(config("spark.cores")).setAppName("DataLoader")val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()import spark.implicits._//加载Product数据val productRDD: RDD[String] = spark.sparkContext.textFile(PRODUCT_DATA_PATH)//对每条数据按照^进行切分,并返回Product样例类后再转换成DataFrameval productDF: DataFrame = productRDD.map(item => {//对每行数据按照^进行切分,需要转义两次val attr: Array[String] = item.split("\\^")//转换成Product样例类,并返回//最后一行即表示返回Product(attr(0).toInt, attr(1).trim, attr(4).trim, attr(5).trim, attr(6).trim)}).toDF()//加载Rating数据val ratingRDD: RDD[String] = spark.sparkContext.textFile(RATING_DATA_PATH)//对每条数据按照,进行切分,并返回Rating样例类后再转换成DataFrameval ratingDF: DataFrame = ratingRDD.map(item => {val attr: Array[String] = item.split(",")Rating(attr(0).toInt, attr(1).toInt, attr(2).toDouble, attr(3).toInt)}).toDF()//声明一个隐式的配置对象,隐式参数implicit val mongoConfig: MongoConfig = MongoConfig(config("mongo.uri"), config("mongo.db"))// 将数据保存到MongoDB中storeDataInMongoDB(productDF,ratingDF)//关闭sparkspark.stop()}//mongoConfig隐式参数,避免多次调用该方法时,多次传入该参数def storeDataInMongoDB(productDF:DataFrame,ratingDF:DataFrame)(implicit mongoConfig: MongoConfig): Unit ={//新建一个mongodb的连接val mongoClient= MongoClient(MongoClientURI(mongoConfig.uri))//定义通过MongoDB客户端拿到的表操作对象,可以理解为db.Productval productCollection = mongoClient(mongoConfig.db)(MONGODB_PRODUCT_COLLECTION)val ratingcollection= mongoClient(mongoConfig.db)(MONGODB_RATING_COLLECTION)//如果MongoDB中有对应的数据库,那么应该删除productCollection.dropCollection()ratingcollection.dropCollection()//将当前数据存入对应的表中productDF.write.option("uri",mongoConfig.uri).option("collection",MONGODB_PRODUCT_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()//对数据表建索引productCollection.createIndex(MongoDBObject("productId" -> 1))ratingcollection.createIndex(MongoDBObject("userId" -> 1))ratingcollection.createIndex(MongoDBObject("productId" -> 1))//关闭MongoDB的连接mongoClient.close()}
}

运行完成后,查看mongodb数据库

C:\Users\admin>mongo
MongoDB shell version v4.2.21
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b8bf9fe8-6ad6-4d42-9d4e-ac06f42f91a1") }
MongoDB server version: 4.2.21
Server has startup warnings:
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten]
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten]
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2022-08-03T00:52:25.812+0800 I  CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2022-08-03T00:52:25.813+0800 I  CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2022-08-03T00:52:25.813+0800 I  CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---> show dbs
admin        0.000GB
config       0.000GB
local        0.000GB
recommender  0.002GB
> use recommender
switched to db recommender
> show tables
Product
Rating> db.Product.find().pretty()
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a42"),"productId" : 3982,"name" : "Fuhlen 富勒 M8眩光舞者时尚节能无线鼠标(草绿)(眩光.悦动.时尚炫舞鼠标 12个月免换电池 高精度光学寻迹引擎 超细微接收器10米传输距离)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/31QPvUDNavL._SY300_QL70_.jpg","categories" : "外设产品|鼠标|电脑/办公","tags" : "富勒|鼠标|电子产品|好用|外观漂亮"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a49"),"productId" : 6797,"name" : "PHILIPS飞利浦HQ912/15两刀头充电式电动剃须刀","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/415UjOLnBML._SY300_QL70_.jpg","categories" : "家用电器|个人护理电器|电动剃须刀","tags" : "飞利浦|剃须刀|家用电器|好用|外观漂亮"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a4b"),"productId" : 8195,"name" : "Kingston 金士顿 Class4 32G TF卡(micro SD)手机存储卡","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41zUS3RjvRL._SY300_QL70_.jpg","categories" : "存储设备|存储卡|电脑/办公","tags" : "存储卡|金士顿|SD卡|容量挺大的|速度快|好用"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a4d"),"productId" : 13316,"name" : "Kingston 金士顿 DataTraveler 101 G2 32GB 优盘","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41nIbzEKQCL._SY300_QL70_.jpg","categories" : "存储设备|U盘|电脑/办公","tags" : "优盘|金士顿|好用|容量挺大的|速度快"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a50"),"productId" : 13543,"name" : "蔡康永的说话之道","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/51RCZJf9vSL._SY344_BO1,204,203,200_QL70_.jpg","categories" : "青春文学|文学艺术|图书音像","tags" : "蔡康永|写的真好|不贵|内容不错|书"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a52"),"productId" : 14103,"name" : "SanDisk 闪迪 microSDXC Class10 64GB至尊高速移动存储卡 UHS-1制式 读写速度最高可达30MB/s","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41mU1iHKkkL._SX300_QL70_.jpg","categories" : "存储设备|存储卡|电脑/办公","tags" : "存储卡|SD卡|容量挺大的|闪迪|速度快|好用"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a54"),"productId" : 21643,"name" : "L'OREAL PARIS巴黎欧莱雅男士劲能醒肤露 8重功效50ml","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41%2B4D64-AEL._SY300_QL70_.jpg","categories" : "男士乳液/面霜|男士护肤|美妆个护","tags" : "好用|护肤品|到货速度快|欧莱雅"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a56"),"productId" : 32512,"name" : "乐扣乐扣(lock&lock) 茶杯HPL934M","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41KDlN3n7-L._SY300_QL70_.jpg","categories" : "杯具/水壶|厨房/餐具|家居生活","tags" : "水壶|好用|乐扣乐扣|到货速度快|质量好"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a57"),"productId" : 33864,"name" : "PNY 必恩威 纽约双子盘 甜心桃 16GB 优盘","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41Aej5QYV0L._SY300_QL70_.jpg","categories" : "存储设备|U盘|电脑/办公","tags" : "办公用品|优盘|必恩威|容量挺大的|速度快"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a59"),"productId" : 48907,"name" : "洗颜专科柔澈泡沫卸妆乳液150ml(进)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41CztXe4GrL._SY300_QL70_.jpg","categories" : "洁面|面部护理|美妆个护","tags" : "好用|女士专用|洗脸用的|到货速度快"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a5b"),"productId" : 57272,"name" : "因为痛,所以叫青春:写给独自站在人生路口的你(精装版)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/51gKCDBk5WL._SY344_BO1,204,203,200_QL70_.jpg","categories" : "青春文学|文学艺术|图书音像","tags" : "好看|内容丰富|书|青春文学|小说|励志|不贵|内容不错"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a5d"),"productId" : 62138,"name" : "WD 西部数据 My Passport 2.5' USB3.0 2TB移动硬盘(黑色 WDBY8L0020BBK-PESN-CH)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41zV8SlYd2L._SY300_QL70_.jpg","categories" : "存储设备|移动硬盘|电脑/办公","tags" : "WD|西部数据|硬盘|容量挺大的|速度快|好用"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a5f"),"productId" : 66003,"name" : "诺基亚N1280(NOKIA N1280)简约超长待机直板手机(黑色)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41gmpH48SIL._SY300_QL70_.jpg","categories" : "手机|手机通讯|手机/数码","tags" : "通话质量好|诺基亚没得说|诺基亚|手机|到货速度快|好用"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a61"),"productId" : 75701,"name" : "世界因你不同:李开复自传","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41yOWkivkKL._SX258_BO1,204,203,200_QL70_.jpg","categories" : "经管类图书|成功/励志|图书音像","tags" : "书|经管类|励志|李开复|写的很好|内容不错"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a63"),"productId" : 90564,"name" : "挪威的森林","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41QgGeshKaL._SY344_BO1,204,203,200_QL70_.jpg","categories" : "政治/军事|人文社科类图书|图书音像","tags" : "书|小说|文学作品|村上春树|日本文学|好看|内容不错|村上什么时候拿诺贝尔奖"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a65"),"productId" : 90897,"name" : "Elizabeth Arden伊丽莎白雅顿绿茶香水30ml(进)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41tHdnLVN1L._SY300_QL70_.jpg","categories" : "彩妆|香水|美妆个护","tags" : "化妆品|伊丽莎白|香水|绿茶味|好用|到货速度快|用起来很舒服"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a67"),"productId" : 102383,"name" : "30年后,你拿什么养活自己?","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/51FlI%2BU0TjL._SY344_BO1,204,203,200_QL70_.jpg","categories" : "经管类图书|图书音像|投资理财","tags" : "书|经管类|励志|鸡汤|好看|到货速度快"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a69"),"productId" : 102886,"name" : "背包十年:我的职业是旅行(历经十年,如何从菜鸟背包客成为职业旅行家)","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/51QKIg6DjCL._SY344_BO1,204,203,200_QL70_.jpg","categories" : "旅游/地图|生活类图书|图书音像","tags" : "书|旅行|背包客必看|好看|励志|内容不错"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a6b"),"productId" : 104168,"name" : "谢谢你离开我","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/41Y3d7LHs8L._SX258_BO1,204,203,200_QL70_.jpg","categories" : "图书音像|少儿|少儿/教育图书","tags" : "书|教育类|少儿图书|好看|很有教育意义|内容不错"
}
{"_id" : ObjectId("62e956d1cd3bd4569cfb7a6d"),"productId" : 109236,"name" : "因为痛,所以叫青春:写给独自站在人生路口的你","imageUri" : "https://images-cn-4.ssl-images-amazon.com/images/I/51cQTMsG1%2BL._SY445_QL70_.jpg","categories" : "青春文学|文学艺术|图书音像","tags" : "青春文学|书|内容不错|好看|鸡汤"
}
Type "it" for more> db.Rating.find().pretty()
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa1"),"userId" : 4867,"productId" : 457976,"score" : 5,"timestamp" : 1395676800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa2"),"userId" : 42103,"productId" : 457976,"score" : 4,"timestamp" : 1215878400
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa3"),"userId" : 71063,"productId" : 457976,"score" : 3,"timestamp" : 1263744000
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa4"),"userId" : 43949,"productId" : 457976,"score" : 4,"timestamp" : 1378396800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa5"),"userId" : 407423,"productId" : 457976,"score" : 5,"timestamp" : 1379001600
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa6"),"userId" : 787,"productId" : 457976,"score" : 5,"timestamp" : 1350057600
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa7"),"userId" : 33007,"productId" : 457976,"score" : 4,"timestamp" : 1229616000
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa8"),"userId" : 100016,"productId" : 457976,"score" : 5,"timestamp" : 1368892800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aa9"),"userId" : 5420,"productId" : 457976,"score" : 5,"timestamp" : 1316188800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aaa"),"userId" : 5387,"productId" : 457976,"score" : 5,"timestamp" : 1366300800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aab"),"userId" : 5675,"productId" : 457976,"score" : 3,"timestamp" : 1331481600
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aac"),"userId" : 96539,"productId" : 457976,"score" : 5,"timestamp" : 1359302400
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aad"),"userId" : 135,"productId" : 457976,"score" : 5,"timestamp" : 1389369600
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aae"),"userId" : 1043,"productId" : 457976,"score" : 5,"timestamp" : 1335974400
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7aaf"),"userId" : 4915,"productId" : 457976,"score" : 5,"timestamp" : 1316620800
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7ab0"),"userId" : 4709,"productId" : 457976,"score" : 5,"timestamp" : 1392134400
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7ab1"),"userId" : 773025,"productId" : 457976,"score" : 4,"timestamp" : 1264089600
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7ab2"),"userId" : 287246,"productId" : 457976,"score" : 4,"timestamp" : 1351267200
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7ab3"),"userId" : 206535,"productId" : 457976,"score" : 5,"timestamp" : 1381766400
}
{"_id" : ObjectId("62e956d2cd3bd4569cfb7ab4"),"userId" : 826302,"productId" : 457976,"score" : 5,"timestamp" : 1398096000
}
Type "it" for more> db.Product.find().count()
96
> db.Rating.find().count()
44852

3.创建项目并初始化业务数据(电商推荐系统)相关推荐

  1. 电商推荐系统三:创建项目并初始化业务数据

    三.创建项目并初始化业务数据 目录 三.创建项目并初始化业务数据 3.1 在IDEA中创建maven项目 3.1.1 项目框架搭建 3.1.2 声明项目中工具的版本信息 3.1.3 添加项目依赖 3. ...

  2. 1.项目体系架构设计(电商推荐系统)

    文章目录 一.项目系统架构 二.项目数据流程 三.数据源解析 1.商品数据表 -- Product 2.用户评分表 -- Rating 四.数据模型(表结构) 五.统计推荐模块 1.历史热门商品统计 ...

  3. 【原创推荐】 计算机毕业设计之Python+Spark+LSTM电商爬虫 商品推荐系统 商品评论情感分析 电商大数据 电商推荐系统 大数据毕业设计

    开发技术 Hadoop.Spark.SparkSQL.Python.MySQL.协同过滤算法(基于用户+基于物品).LSTM情感分析.Python爬虫.echarts.阿里云短信接口.支付宝沙箱支付. ...

  4. 8.尚硅谷电商推荐系统预览

    课程地址:尚硅谷大数据项目教程(大数据实战电商推荐系统) 尚硅谷电商推荐系统的配套资料及虚拟机 链接:https://pan.baidu.com/s/1iSMqV2wPkEfIsO1FrkxRNQ?p ...

  5. 电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取

    文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...

  6. 2.工具环境搭建(电商推荐系统)

    文章目录 1.MongoDB(单节点)环境配置 2.Redis(单节点)环境配置 3.Spark(单节点)环境配置 4.Zookeeper(单节点)环境配置 5.Flume-ng(单节点)环境配置 6 ...

  7. 客快物流大数据项目(二十五):初始化业务数据

    目录 初始化业务数据 一.安装OGG源端 1.在Oracle中创建OGG相关的用户和表空间 2.OGG源端初始化

  8. idea下使用springinitializr创建项目时 初始化失败的解决

    idea自带的地址无使用使用阿里的就可以了 idea下使用springinitializr创建项目时 初始化失败的解决 周山 关注 2020.08.05 13:32:26字数 10阅读 1,085 i ...

  9. 【大数据实战电商推荐系统】

    文章目录 第1章 项目体系框架设计 第2章 工具环境搭建 第3章 项目创建并初始化业务数据 3.1 IDEA创建Maven项目(略) 3.2 数据加载准备(说明书) 3.3 数据初始化到MongoDB ...

最新文章

  1. Android中的那些权限
  2. python动态数组的最大值_python实现动态数组的示例代码
  3. [Javascript]编程风格
  4. 成功解决AttributeError: module 'numpy' has no attribute 'integer'
  5. windows7出现MTP usb设备驱动安装问题解决方法
  6. leetcode279 完全平方数
  7. 第九周项目6-穷举法之年龄几何
  8. es6 async函数实例:按顺序完成异步操作
  9. 两个数相乘积一定比每个因数都大_两个多位数相乘,积一定比每一个因数都大。[ ]...
  10. Windows8-ConsumerPreview 虚拟机安装与体验
  11. Qt之利用事件过滤器在QLabel上画框
  12. 百度定位出现162错误码
  13. win10系统迁移后系统重装_win10分区助手迁移系统到SSD固态硬盘的技巧
  14. acl 影响因子_计算机领域EI和SCI收录期刊及影响因子
  15. Mac PHP5.6安装
  16. 【元宇宙经济学】元宇宙经济的四要素
  17. Dalsa面阵相机外触发接线方式
  18. 算法-数塔问题-c语言
  19. 按键精灵自动登录网站范例源码
  20. libjpeg库使用

热门文章

  1. Redist-Java 有序列表操作
  2. linux教程:查看端口占用情况及开放关闭端口
  3. 安卓期末复习大纲(全)
  4. 【NOJ1149】【算法实验四】【DP_动态规划】旅游预算/加油站问题
  5. linux运行wordcount,hadoop运行第一个实例wordcount
  6. 百度推送启动与停止服务的语句是_这些网课学习栏目推送低俗信息,国家网信办查处!...
  7. 关于电子书(CHM)无法打开的解决方法
  8. R统计绘图-变量分组相关性网络图(igraph)
  9. iphone自定义闹钟铃声
  10. 编曲软件哪个好用-哪个好上手