写代码(二)Scala代码实现(2)【MongoDB--将初始化的数据导入到MongoDB】

(1)Scala代码:

自定义数据类

package test

/**
  * @Author : ASUS and xinrong
  * @Version : 2020/9/4
  *  数据格式转换类
  *  ---------------电影表------------------------
  *  1
  *  Toy Story (1995)
  *
  *  81 minutes
  *  March 20, 2001
  *  1995
  *  English
  *  Adventure|Animation|Children|Comedy|Fantasy
  *  Tom Hanks|Tim Allen|Don Rickles|Jim Varney|Wallace Shawn|John Ratzenberger|Annie Potts|John Morris|Erik von Detten|Laurie Metcalf|R. Lee Ermey|Sarah Freeman|Penn Jillette|Tom Hanks|Tim Allen|Don Rickles|Jim Varney|Wallace Shawn
  *  John Lasseter
  */
case class Movie(val mid:Int,val name:String,val descri:String,
                 val timelong:String,val cal_issue:String,val shoot:String,
                 val language:String,val genres :String,val actors:String,val directors:String)
/**
  * -----用户对电影的评分数据集--------
  * 1,31,2.5,1260759144
  */
case class Rating(val uid:Int,val mid:Int,val score:Double,val timastamp:Int)

/**
  * --------用户对电影的标签数据集--------
  * 15,339,sandra 'boring' bullock,1138537770
  */
case class Tag(val uid:Int,val mid:Int,val tag:String,val timestamp:Int)

/**
  *
  * MongoDB配置对象
  * @param uri
  * @param db
  */
case class MongoConfig(val uri:String,val db:String)

DataLoader类

package test

import com.mongodb.casbah.commons.MongoDBObject
import com.mongodb.casbah.{MongoClient, MongoClientURI}
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
  * @Author : ASUS and xinrong
  * @Version : 2020/9/4
  *
  *   Spark SQL--初始化数据
  */
object DataLoader {

  //---------- MongoDB 中的表 Collection -------------------
  // Moive在MongoDB中的Collection名称【表】
  val MOVIES_COLLECTION_NAME = "Movie"
  // Rating在MongoDB中的Collection名称【表】
  val RATINGS_COLLECTION_NAME = "Rating"
  // Tag在MongoDB中的Collection名称【表】
  val TAGS_COLLECTION_NAME = "Tag"

  def main(args: Array[String]): Unit = {
    //封装各个文件路径
    val DATAFILE_MOVIES="D:\\tmp_files\\reco_data\\small\\movies.csv"
    val DATAFILE_RATINGS="D:\\tmp_files\\reco_data\\small\\ratings.csv"
    val DATAFILE_TAGS="D:\\tmp_files\\reco_data\\small\\tags.csv"

    val params=scala.collection.mutable.Map[String,Any]()
    params+="spark.cores"->"local"
//---------------- 关于 MongoDB 的声明 -------------------------
    params+="mongo.uri"->"mongodb://192.168.212.21:27017/recom"
    params+="mongo.db"->"recom"
    //定义mongoDB配置对象-隐式对象:
    implicit val mongoConfig=new MongoConfig(params("mongo.uri").asInstanceOf[String],
      params("mongo.db").asInstanceOf[String]);

    //一、声明Spark环境
     //1.config--对"local"做一层封装:
    val config= new SparkConf().setAppName("DataLoader").setMaster(params("spark.cores").asInstanceOf[String]);
     //2.SparkSession
    val spark=SparkSession.builder().config(config).getOrCreate()

    //二、加载数据集
     //1.声明各个数据所在路径(单独拿出来的原因:生产和测试时的路径通常不同,将各个文件的路径放在一起便于修改)
    val movieRDD=spark.sparkContext.textFile(DATAFILE_MOVIES)
    val ratingRDD=spark.sparkContext.textFile(DATAFILE_RATINGS)
    val tagRDD=spark.sparkContext.textFile(DATAFILE_TAGS)
     //2.将RDD转换成DataFrame--使用SparkSQL比较好的特性(读入/写出数据的时候很方便)
     //知识点参考:https://www.cnblogs.com/liuxinrong/articles/13393309.html
     //            https://www.cnblogs.com/liuxinrong/articles/13332014.html
     //1)import 导入隐式转换
     import spark.sqlContext.implicits._
     //2)关联数据和Schema
     val movieOF=movieRDD.map(
       line=>{
         //用"\^"分割行数据
         val x=line.split("\\^")
         //2)定义Schema--通过case class方式(trim是将前后的空格去掉)
         Movie(x(0).trim.toInt,x(1).trim,x(2).trim,
           x(3).trim,x(4).trim, x(5).trim,x(6).trim,x(7).trim,x(8).trim,x(9).trim)
       }
     ).toDF() //3)RDD转换成DF
    val ratingOF=ratingRDD.map(
      line=>{
        val x=line.split(",")
        Rating(x(0).trim.toInt,x(1).trim.toInt,x(2).trim.toDouble,x(3).trim.toInt)
      }
    ).toDF()
    val tagOF=tagRDD.map(
      line=>{
        val x=line.split(",")
        Tag(x(0).trim.toInt,x(1).trim.toInt,x(2).trim,x(3).trim.toInt)
      }
    ).toDF()

//    movieOF.show() //默认最多展示20行数据
//    ratingOF.show(2) //只展示2行结果数据
//    tagOF.show()
//---------------------------------------  MongoDB  --------------------------------------
    //三、将数据写入到MongoDB
    storeDataInMongo(movieOF,ratingOF,tagOF)
  }
  //                                                                             隐式参数:mongoConfig
  def storeDataInMongo(movieOF: DataFrame, ratingOF: DataFrame, tagOF: DataFrame)(implicit mongoConfig: MongoConfig)= {
     //1.创建到MongoDB的连接去操作MongoDB--用到的是传入的隐式参数
    val mongoClient=MongoClient(MongoClientURI(mongoConfig.uri)) //mongoURI是MongoDB的地址

    //对于MongoDB的删表操作--删除某个库下的表
    //MongoDB的驱动会自动创建Collection(表),这个和ES不同
    mongoClient(mongoConfig.db)(MOVIES_COLLECTION_NAME).dropCollection()
    mongoClient(mongoConfig.db)(RATINGS_COLLECTION_NAME).dropCollection()
    mongoClient(mongoConfig.db)(TAGS_COLLECTION_NAME).dropCollection()

     //2.写入MongoDB
    movieOF.write
      .option("uri",mongoConfig.uri)
      .option("collection", MOVIES_COLLECTION_NAME)  //表名
      .mode("overwrite") //采用overwrite的写入方式可以不用先删除表格,先删除的话也可以
      .format("com.mongodb.spark.sql") //驱动的名字
      .save() //保存
    ratingOF.write
      .option("uri",mongoConfig.uri)
      .option("collection", RATINGS_COLLECTION_NAME)
      .mode("overwrite")
      .format("com.mongodb.spark.sql") //驱动的名字
      .save() //保存
    tagOF.write
      .option("uri",mongoConfig.uri)
      .option("collection", TAGS_COLLECTION_NAME)
      .mode("overwrite")
      .format("com.mongodb.spark.sql") //驱动的名字
      .save() //保存

    //3.创建mongodb索引--写完数据之后就创建索引
    mongoClient(mongoConfig.db)(MOVIES_COLLECTION_NAME).createIndex(MongoDBObject("mid"->1)) //针对mid列创建索引
    mongoClient(mongoConfig.db)(RATINGS_COLLECTION_NAME).createIndex(MongoDBObject("mid"->1)) //针对mid列和uid列创建索引
    mongoClient(mongoConfig.db)(RATINGS_COLLECTION_NAME).createIndex(MongoDBObject("uid"->1))
    mongoClient(mongoConfig.db)(TAGS_COLLECTION_NAME).createIndex(MongoDBObject("mid"->1))  //针对mid列和uid列创建索引
    mongoClient(mongoConfig.db)(TAGS_COLLECTION_NAME).createIndex(MongoDBObject("uid"->1))

    //4.关闭MongoDB的连接
    mongoClient.close()
  }
}

(2)启动MongoDB

[root@tjx1 mongodb-linux-x86_64-rhel62-3.4.3]# pwd

/usr/local/mongodb-linux-x86_64-rhel62-3.4.3

[root@tjx1 mongodb-linux-x86_64-rhel62-3.4.3]# ./bin/mongod -config ./data/mongodb.conf

接下来连接Robo:

 

 

 

(3)运行代码、查看Robo

 

 

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3