原文出处:http://blog.csdn.net/omrapollo/article/details/66968147
引入依赖
创建方法见上一篇博客: Spark+IntelliJ IDEA创建项目
引入如下依赖:
实现代码
import org.apache.hadoop.conf.Configuration
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.bson.{BSONObject, BasicBSONObject}
/**
* Created by maxi on 2017/3/24.
*/
object MongoTest {
def main(args: Array[String]) {
/**
* 对于所有的spark程序所言,要进行所有的操作,首先要创建一个spark上下文。
* 在创建上下文的过程中,程序会向集群申请资源及构建相应的运行环境。
* 设置spark应用程序名称
* 创建的 sarpkContext 唯一需要的参数就是 sparkConf,它是一组 K-V 属性对。
*/
val conf = new SparkConf().setAppName("SparkRDDCount").setMaster("local")
val sc = new SparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)
val data = sc.parallelize(List(("Tom", "31"), ("Jack", "22"), ("Mary", "25")))
val config = new Configuration()
config.set("mongo.input.uri", "mongodb://127.0.0.1:27017/bjhee.sparkoutputtest")
config.set("mongo.input.fields", """{"name":1, "age":1, "_id":1}""")
config.set("mongo.input.noTimeout", "true")
config.set("mongo.output.uri", "mongodb://127.0.0.1:27017/bjhee.sparkoutputtest")
System.out.println(" ================================= ")
// 使用MongoOutputFormat将数据写入到MongoDB中
val rdd = data.map((elem) => {
val obj = new BasicBSONObject()
obj.put("name", elem._1)
obj.put("age", elem._2)
//转换后的结果,KV对
//第一个是BSON的ObjectId,插入时可以指定为null,MongoDB Driver在插入到MongoDB时,自动的生成
//obj是BSONObject,是MongoDB Driver接收的插入对象
(null, obj)
})
// RDD data is a KV pair,so it can use saveAsNewAPIHadoopFile
rdd.saveAsNewAPIHadoopFile("file:///bogus", classOf[Any], classOf[Any], classOf[com.mongodb.hadoop.MongoOutputFormat[Any, Any]], config)
// 使用MongoInputFormat将数据从MongoDB中读取
val documentRDD = sc.newAPIHadoopRDD(
config,
classOf[com.mongodb.hadoop.MongoInputFormat],
classOf[Object],
classOf[BSONObject])
System.out.println("documentRDD = " + documentRDD.count())
val userRDD = documentRDD.map { case (_, doc) =>
(getValue(doc, "name"), getValue(doc, "age"))
}.reduceByKey(_ ++ _).
collect().
foreach(println)
// documentRDD.saveAsTextFile("b.txt") // 将数据保存到文件
System.out.println(" ================================= ")
}
def getValue(dbo: BSONObject, key: String) = {
val value = dbo.get(key)
if (value eq null) "" else value.asInstanceOf[String]
}
}