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>
示例中没有实际的数据处理分析的内容,这部分才会是正常工作的重点哦。