我能够将数据帧保存到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()
答案 0 :(得分:0)
使用RDD
从DStream
访问基础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连接将成为接收器。