spark读取mongodb

Spark-mongodb:
Spark操作mongodb的api提供了RDD和dataSet、DataFrame读取方式。关键看你的spark的使用版本,第三方依赖包的下载见mongodb官网
def load[D: ClassTag](sc: SparkContext, readConfig: ReadConfig)(implicit e: D DefaultsTo Document): MongoRDD[D] =
builder().sparkContext(sc).readConfig(readConfig).build().toRDDD
此时的读取配置是通过SparkConf设置的
spark.mongodb.output.uri=mongodb://127.0.0.1/
spark.mongodb.output.database=test
spark.mongodb.output.collection=myCollection
val rdd = MongoSpark.load(sc)
println(rdd.count)
println(rdd.first.toJson)
sc.loadFromMongoDB()
sc.loadFromMongoDB(ReadConfig(Map(“uri”->”mongodb://example.com/database.collection”)))
此时mongodb的读取配置是通过ReadConfig来进行设置的
import com.mongodb.spark.config._
val readConfig = ReadConfig(Map(“collection” -> “spark”, “readPreference.name” -> “secondaryPreferred”), Some(ReadConfig(sc)))
val customRdd = MongoSpark.load(sc, readConfig)
println(customRdd.count)
println(customRdd.first.toJson)
val configur = ReadConfig(Map(“uri”->”mongodb://user:password@host:port,host:port,host:port”,
“spark.mongodb.input.partitioner”->”MongoShardedPartitioner”,
“partitionerOptions.numberOfPartitions”->”128”,
“readPreference.name”->”primaryPreferred”,”database”->”test”, “collection”->”test”))
val mongoSpark = MongoSpark.load( sc,configur )
def filter8Id = ( str:String,f:String) => str.substring(2).equals(f)
mongoSpark.filter( x => filter8Id( x.getString(“id”),”1”)).first()
可以利用spark-rdd的filter等api对mongodb的数据进行过滤
此时你可以将你所需要的业务数据放在内存中,通过spark-sql进行业务查询
如果你感觉这个很强大了,那你就错了,牛逼的在后面呢;spark支持mongodb的聚合框架的运算
mongoSpark.withPipeline(Seq(Document.parse(“{match:{age:{lg:25}}}”)))
如果此时返回的结果是空的,会跑出java.lang.NullPointerException
注:
如果你使用的是mongodb的单机版,你在用spark链接mongodb的时候可能会遇到一些问题,如:If you get a java.net.BindException: Can’t assign requested address
你可以尝试将SPARK_LOCAL_IP 设置在你的环境变量里面
如export SPARK_LOCAL_IP = 127.0.0.1;还有当你进入spark-shell的时候你可以设置:
–driver-java-options “-Djava.net.preferIPv4Stack=true”

Spark-streaming—–>mongodb:
nc -lk 9999
import com.mongodb.spark.sql._
import org.apache.spark.streaming._
val ssc = new StreamingContext(sc, Seconds(1))
val lines = ssc.socketTextStream(“localhost”, 9999)

val words = lines.flatMap(_.split(” “))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)

case class WordCount(word: String, count: Int)

wordCounts.foreachRDD({ rdd =>
import spark.implicits._
val wordCounts = rdd.map({ case (word: String, count: Int)
=> WordCount(word, count) }).toDF()
wordCounts.write.mode(“append”).mongo()
})
ssc.start()
此时你查询mongodb会有新的数据插入。
从mongodb的2.几开始使用,历经了很多挫折,起初使用的是hadoop对接mongodb的那个jar包,但是我们针对自己的数据结构的更新的时候遇到了问题,在修改过那个依赖包的源码后发现需要修改的东西很多,而且遇到了很多未知的问题。这个坑一步一步的踩过来了,现在好了,mongodb的官方人员对这些做了很大的调整,使得hadoop和spark这两个优秀的计算框架对mongodb有了很好的支持和使用,我相信mongodb会越来越火的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值