如何计算前k个词
How to compute the top k words
我想计算 Spark-Streaming 应用程序中排名前 k 的单词,文本行在 window.
时间内收集
我得到了以下代码:
...
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)
})
...
似乎有效。
问题:
top k 字图是使用 foreachRDD
函数计算的,该函数对 reduceByKey
返回的每个 RDD
执行 top+print 函数(wc
变量)。
事实证明 reduceByKey
returns 一个 DStream
和一个 RDD
,所以上面的代码可以工作,但规范不保证正确的行为。
我错了吗,它适用于所有情况?
为什么在 spark-streaming 中没有一种方法将 DStream
视为单个 RDD
,而不是 RDD
对象的集合,以便执行更复杂的转换 ?
我的意思是这样的函数:dstream.withUnionRDD(rdd => ...)
允许您对 single/union RDD
进行转换和操作。有没有等效的方法来做这些事情?
其实我完全误解了DStream由多个RDD组成的概念。一个 DStream 由多个 RDD 组成,但随着时间的推移。
在微批处理的上下文中,DStream 由当前 RDD 组成。
所以,上面的代码总是有效的。
我想计算 Spark-Streaming 应用程序中排名前 k 的单词,文本行在 window.
时间内收集我得到了以下代码:
...
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)
})
...
似乎有效。
问题:
top k 字图是使用 foreachRDD
函数计算的,该函数对 reduceByKey
返回的每个 RDD
执行 top+print 函数(wc
变量)。
事实证明 reduceByKey
returns 一个 DStream
和一个 RDD
,所以上面的代码可以工作,但规范不保证正确的行为。
我错了吗,它适用于所有情况?
为什么在 spark-streaming 中没有一种方法将 DStream
视为单个 RDD
,而不是 RDD
对象的集合,以便执行更复杂的转换 ?
我的意思是这样的函数:dstream.withUnionRDD(rdd => ...)
允许您对 single/union RDD
进行转换和操作。有没有等效的方法来做这些事情?
其实我完全误解了DStream由多个RDD组成的概念。一个 DStream 由多个 RDD 组成,但随着时间的推移。
在微批处理的上下文中,DStream 由当前 RDD 组成。
所以,上面的代码总是有效的。