从DStream RDD向批处理RDD添加新元素

时间:2015-04-15 20:44:05

标签: apache-spark spark-streaming

将DStream RDD与Batch RDD连接/联合/组合的唯一方法是通过“transform”方法,该方法返回另一个DStream RDD,因此在微批结束时将其丢弃。

有没有办法,例如union Dstream RDD with Batch RDD,它生成一个新的Batch RDD,其中包含DStream RDD和Batch RDD的元素。

一旦以上述方式创建了这样的批量RDD,其他DStream RDD就可以将其用于例如此时加入结果可以是另一个DStream RDD

实际上,上述功能将导致批量RDD中元素的定期更新(添加) - 其他元素将继续来自DStream RDD,这些RDD随每个微批量继续流入。 新到达的DStream RDD也可以与之前更新的BAtch RDD连接并生成结果DStream RDD

使用updateStateByKey可以实现几乎所有的东西,但有没有办法按照这里描述的那样去做

1 个答案:

答案 0 :(得分:4)

另一种方法是将批输入转换为DStream并将其与流输入结合。然后使用foreachRDD将其写出来,这是您对其他作业的批量输入。

 val batch = sc.textFile(...)

 val ssc = new StreamingContext(sc, Seconds(30))
 val stream = ssc.textFileStream(...)

 import scala.collection.mutable
 val batchStream = ssc.queueStream(mutable.Queue.empty[RDD[String]], oneAtATime = false, defaultRDD = batch)

 val union = ssc.union(Seq(stream, batchStream))

 union.print()

 union.foreachRDD { rdd =>
   // Delete previous, or use SchemaRDD with .insertInto(, overwrite = true)
   rdd.saveTextFile(...)
 }

 ssc.start()
 ssc.awaitTermination()