如何计算前k个单词

时间:2015-04-09 13:19:56

标签: spark-streaming

我想在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执行top + print函数(wc变量)。

事实证明,reduceByKey会返回DStream一个RDD,因此上述代码可以正常工作,但规格并不能保证正确的行为。

我错了,它适用于所有情况吗?

为什么在spark-streaming中没有一种方法可以将DStream视为单个RDD而不是RDD个对象的集合,以便执行更复杂的操作转型?

我的意思是像dstream.withUnionRDD(rdd => ...)这样的函数,它允许您对单个/ union RDD进行转换和操作。是否有相同的方法来做这些事情?

1 个答案:

答案 0 :(得分:2)

实际上我完全误解了由多个RDD组成的DStream的概念。 DStream由多个RDD构成,但随着时间的推移。

在微批处理的上下文中,DStream由当前的RDD组成。

所以,上面的代码总是有效。