Spark从Mysql中根据条件查询数据并写入到Mongodb

Spark支持的数据源非常之多,例如textfile,Hive,jdbc,sequence file等等,这里我想展示的是一个从Mysql中读取数据经过处理分析后存入Mongodb的例子。语言自然是Scala,下面直接放上代码:

package com.test

import com.mongodb.{MongoClient, MongoClientURI}
import org.apache.spark.sql.{Row, SparkSession}
import org.bson.BsonDocument
import util.BsonTool

object TestInsertDataFromDB2Mongo {

  /***
    * 本方法从mysql的表中根据条件读取部分数据并写入到mongodb
    * @param args
    */
  def main(args: Array[String]): Unit = {
    val spark=SparkSession.builder().appName("test1").getOrCreate()
    val jdbcDF = spark.read
      .format("jdbc")
      //填写jdbc连接的地址
      .option("url", "jdbc:postgresql:dbserver")
      //库名.表名
      .option("dbtable", "schema.tablename")
      //用户名及密码
      .option("user", "username")
      .option("password", "password")
      .load()
    //条件查询
    jdbcDF.select("id","name").foreachPartition(x=>insertData2Mongo(x))
  }
  def insertData2Mongo(iter: Iterator[Row]): Unit ={
    if(iter.nonEmpty) {
      //建立与mongodb的连接,每个partition只会创建并使用一个,避免资源的浪费
      //说明一下 其实这里用MongoSpark更合适,但我之前使用到的时候其实针对每一条数据都要先做一次查询,之后再决定是否插入。MongoSpark不太适合,这里偷个懒,就不放MongoSpark的版本了,对应的资料也很多,需要了解的朋友自行去查阅。
      val list=iter.toList
      val uri = new MongoClientURI("mongodb://ip:host/")
      val mongoClient = new MongoClient(uri)
      val db = mongoClient.getDatabase("test")
      val collection = db.getCollection("collectionName", classOf[BsonDocument])
      val document=new BsonDocument()
      for(cur<-list){
        //从Row中获得数据
        val id=cur.getInt(0)
        val name=cur.getString(1)
        document.put("id",BsonTool.objectToBsonValue(id))
        document.put("name",BsonTool.objectToBsonValue(name))
        //插入到mongodb中
        collection.insertOne(document)
      }
    }
  }
}

使用到的BsonTool类代码,这是个java类:

package util;

import org.bson.*;

import java.util.Date;

public class BsonTool {

    /**
     * Java对象转BsonValue对象
     * @param obj
     * @return
     */
    public static BsonValue objectToBsonValue(Object obj){
        if (obj instanceof Integer){
            return new BsonInt32((Integer) obj);
        }

        if (obj instanceof String){
            return new BsonString((String) obj);
        }

        if (obj instanceof Long){
            return new BsonInt64((Long) obj);
        }

        if (obj instanceof Date){
            return new BsonDateTime(((Date) obj).getTime());
        }
        return new BsonNull();
    }

}

关于项目依赖的管理,我还是使用了maven,下面上pom.xml依赖部分的配置:

                <dependency> <!-- Spark -->
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-core_2.11</artifactId>
			<version>2.2.1</version>
			<!--<scope>provided</scope>-->
		</dependency>
		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
			<version>2.1.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.spark</groupId>
			<artifactId>spark-sql_2.11</artifactId>
			<version>2.2.1</version>
		</dependency>
                <!-- 如果使用MongoSpark需要用到 -->
		<dependency>
			<groupId>org.mongodb.spark</groupId>
			<artifactId>mongo-spark-connector_2.11</artifactId>
			<version>2.2.1</version>
		</dependency>

                <dependency>
                    <groupId>org.mongodb</groupId>
                    <artifactId>mongodb-driver</artifactId>
                    <version>3.6.0</version>
                </dependency>
                <dependency>
                    <groupId>org.mongodb</groupId>
                    <artifactId>mongodb-driver-core</artifactId>
                    <version>3.6.0</version>
                </dependency>
                <dependency>
                    <groupId>org.mongodb</groupId>
                    <artifactId>bson</artifactId>
                    <version>3.6.0</version>
                </dependency>

示例中没有实际的数据处理分析的内容,这部分才会是正常工作的重点哦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值