Spark DStream排序并采用N个元素

时间:2015-10-07 09:23:28

标签: apache-spark spark-streaming

我正在使用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中的元素之间进行排序吗?如果不是如何实现它?

1 个答案:

答案 0 :(得分:2)

您可以在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