我想计算一个Spark-Streaming应用程序中的前k个单词,并在一个时间窗口中收集文本行。

我最终得到了以下代码:

...
val window = stream.window(Seconds(30))

val wc = window
  .flatMap(line => line.split(" "))
  .map(w => (w, 1))
  .reduceByKey(_ + _)

wc.foreachRDD(rdd => {
  println("---------------------------------------------------")
  rdd.top(10)(Ordering.by(_._2)).zipWithIndex.foreach(println)
})
...

看来行得通。

问题:
前k个字图表是使用foreachRDD函数计算的,该函数在RDD返回的每个reduceByKey(wc变量)上执行top + print函数。

事实证明,reduceByKey返回带有单个DStreamRDD,因此上述代码可以正常工作,但规范不能保证正确的行为。

我错了,并且在所有情况下都有效吗?

为什么在 Spark 流传输中没有一种方法可以将DStream视为单个RDD而不是RDD对象的集合,以便执行更复杂的转换?

我的意思是这样的函数:dstream.withUnionRDD(rdd => ...),它使您可以对单个/联合RDD进行转换和操作。有没有做这种事情的等效方法?

最佳答案

实际上,我完全误解了由多个RDD组成的DStream的概念。一个DStream由多个RDD组成,但是随着时间的流逝。

在微批处理的情况下,DStream由当前的RDD组成。

因此,以上代码始终有效。

09-26 22:47
查看更多