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

编程入门 行业动态 更新时间:2024-10-12 22:29:48

文章目录

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


  • 课程地址:尚硅谷大数据项目教程(大数据实战电商推荐系统)
  • 尚硅谷电商推荐系统的配套资料及虚拟机
    链接:https://pan.baidu/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数据集

  数据格式:

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

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

字段名字段类型字段描述字段备注
productIdInt商品ID
nameString商品名称
categoriesString商品分类每一项用“|”分割
imageUrlString商品图片URL
tagsString商品UGC标签每一项用“|”分割

2.Ratings数据集

  数据格式:

userIdprudcutIdratingtimestamp
48674579765.01395676800

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

字段名字段类型字段描述字段备注
userIdInt用户ID
produtIdInt商品ID
scoreDouble评分值
timestampLong评分的时间

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.recommender



import 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样例类后再转换成DataFrame
    val 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样例类后再转换成DataFrame
    val 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)
    //关闭spark
    spark.stop()
  }
  //mongoConfig隐式参数,避免多次调用该方法时,多次传入该参数
  def storeDataInMongoDB(productDF:DataFrame,ratingDF:DataFrame)(implicit mongoConfig: MongoConfig): Unit ={
    //新建一个mongodb的连接
    val mongoClient= MongoClient(MongoClientURI(mongoConfig.uri))
    //定义通过MongoDB客户端拿到的表操作对象,可以理解为db.Product
    val 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/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/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/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/images/I/41nIbzEKQCL._SY300_QL70_.jpg",
        "categories" : "存储设备|U盘|电脑/办公",
        "tags" : "优盘|金士顿|好用|容量挺大的|速度快"
}
{
        "_id" : ObjectId("62e956d1cd3bd4569cfb7a50"),
        "productId" : 13543,
        "name" : "蔡康永的说话之道",
        "imageUri" : "https://images-cn-4.ssl-images-amazon/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/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/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/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/images/I/41Aej5QYV0L._SY300_QL70_.jpg",
        "categories" : "存储设备|U盘|电脑/办公",
        "tags" : "办公用品|优盘|必恩威|容量挺大的|速度快"
}
{
        "_id" : ObjectId("62e956d1cd3bd4569cfb7a59"),
        "productId" : 48907,
        "name" : "洗颜专科柔澈泡沫卸妆乳液150ml(进)",
        "imageUri" : "https://images-cn-4.ssl-images-amazon/images/I/41CztXe4GrL._SY300_QL70_.jpg",
        "categories" : "洁面|面部护理|美妆个护",
        "tags" : "好用|女士专用|洗脸用的|到货速度快"
}
{
        "_id" : ObjectId("62e956d1cd3bd4569cfb7a5b"),
        "productId" : 57272,
        "name" : "因为痛,所以叫青春:写给独自站在人生路口的你(精装版)",
        "imageUri" : "https://images-cn-4.ssl-images-amazon/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/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/images/I/41gmpH48SIL._SY300_QL70_.jpg",
        "categories" : "手机|手机通讯|手机/数码",
        "tags" : "通话质量好|诺基亚没得说|诺基亚|手机|到货速度快|好用"
}
{
        "_id" : ObjectId("62e956d1cd3bd4569cfb7a61"),
        "productId" : 75701,
        "name" : "世界因你不同:李开复自传",
        "imageUri" : "https://images-cn-4.ssl-images-amazon/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/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/images/I/41tHdnLVN1L._SY300_QL70_.jpg",
        "categories" : "彩妆|香水|美妆个护",
        "tags" : "化妆品|伊丽莎白|香水|绿茶味|好用|到货速度快|用起来很舒服"
}
{
        "_id" : ObjectId("62e956d1cd3bd4569cfb7a67"),
        "productId" : 102383,
        "name" : "30年后,你拿什么养活自己?",
        "imageUri" : "https://images-cn-4.ssl-images-amazon/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/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/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/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.创建项目并初始化业务数据(电商推荐系统)

本文发布于:2023-06-28 16:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/930418.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:初始化   业务   项目   数据   系统

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!