我正在使用spark stream从kafka集群中读取数据.我想对DStream对进行排序并单独获得前N个.到目前为止,我已经使用了
val result = ds.reduceByKeyAndWindow((x: Double, y: Double) => x + y,
Seconds(windowInterval), Seconds(batchInterval))
result.transform(rdd => rdd.sortBy(_._2, false))
result.print
我的问题是
>如何从dstream中仅获取前N个元素?
>变换操作由rdd应用rdd.那么结果会在所有rdds中的元素之间进行排序吗?如果没有如何实现呢?
最佳答案 您可以在DStream对象中使用transform方法,然后对输入RDD进行排序,并在列表中获取它的n个元素,然后过滤原始RDD以包含在此列表中.
注意:RDD和DStream都是不可变的,因此任何转换都将返回新的RDD或DStream,但不会在原始RDD或DStream中更改.
val n = 10
val topN = result.transform(rdd =>{
val list = rdd.sortBy(_._2, false).take(n)
rdd.filter(list.contains)
})
topN.print