将DataStream数据保存到MongoDB /将DS转换为DF

时间:2016-05-10 07:05:03

标签: mongodb apache-spark apache-kafka spark-streaming

我能够将数据帧保存到mongoDB,但我的spark流程中的程序提供了一个数据流(kafkaStream),我无法将其保存在mongodb中,也无法将此数据流转换为数据帧。有没有图书馆或方法可以做到这一点?任何投入都受到高度赞赏。

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import org.apache.spark.streaming.kafka.KafkaUtils

object KafkaSparkStream {

    def main(args: Array[String]){

        val conf = new SparkConf().setMaster("local[*]").setAppName("KafkaReceiver")
        val ssc = new StreamingContext(conf, Seconds(10))
        val kafkaStream = KafkaUtils.createStream(ssc, 
            "localhost:2181","spark-streaming-consumer-group", Map("topic" -> 25))
        kafkaStream.print()

        ssc.start()
        ssc.awaitTermination()
    }
}

将DF保存到mongodb - 成功

val mongoDbFormat = "com.stratio.datasource.mongodb"
val mongoDbDatabase = "mongodatabase"
val mongoDbCollection = "mongodf"

val mongoDbOptions = Map(
    MongodbConfig.Host -> "localhost:27017",
    MongodbConfig.Database -> mongoDbDatabase,
    MongodbConfig.Collection -> mongoDbCollection
)

//with DataFrame methods
 dataFrame.write
    .format(mongoDbFormat)
    .mode(SaveMode.Append)
    .options(mongoDbOptions)
    .save()

1 个答案:

答案 0 :(得分:0)

使用RDDDStream访问基础foreachRDD,将其转换为DataFrame并在其上使用您的DF功能。

将RDD转换为DataFrame的最简单方法是首先将数据转换为模式,在Scala中用case class

表示
case class Element(...)

val elementDStream = kafkaDStream.map(entry => Element(entry, ...))
elementDStream.foreachRDD{rdd =>
    val df = rdd.toDF
    df.write(...)
}

另外,请注意Spark 2.0,这个过程将随着 Structured Streaming 的引入而彻底改变,其中MongoDB连接将成为接收器。