我在驱动程序中有这个功能,它将rdds的结果收集到一个数组中并发回。但是,即使RDD(在dstream中)有数据,该函数也会返回一个空数组......我做错了什么?
def runTopFunction() : Array[(String, Int)] = {
val topSearches = some function....
val summary = new ArrayBuffer[(String,Int)]()
topSearches.foreachRDD(rdd => {
summary = summary.++(rdd.collect())
})
return summary.toArray
}
答案 0 :(得分:1)
因此,虽然foreachRDD
将执行您要执行的操作,但它也是非阻塞的,这意味着它不会等到所有流都被处理完毕。由于您在调用toArray
后立即在缓冲区上调用foreachRDD
,因此尚未处理任何元素。
答案 1 :(得分:1)
DStream.forEachRDD
是对给定DStream
的操作,将在每个流批处理间隔计划执行。这是后来要执行的作业的声明性构造。
不支持以这种方式累积值,因为当Dstream.forEachRDD只是说“在每次迭代时执行此操作”时,会立即执行周围的累积代码,从而产生一个空数组。
根据计算后summary
数据发生的情况,如何实现这一点的选项很少:
topSearches
功能应用到dstream后写入存储。