【问题标题】:Spark DStream sort and take N elementsSpark DStream 排序并取 N 个元素
【发布时间】:2015-10-07 09:23:27
【问题描述】:

我正在使用 spark 流从 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 应用了变换操作。那么结果是否会在所有 rdds 中的元素之间进行排序?如果没有怎么实现?

【问题讨论】:

  • 你能解决这个问题吗?
  • 因为 reduceByKeyAndWindow 导致单个 rdd 。 rdd.sortBy().take(N) 将起作用。
  • result.transform(rdd => rdd.sortBy(_._2, false)) ,我认为在转换方法中添加 take 会给出错误提示,发现:数组,需要:rdd[?]。请问你是怎么解决的?

标签: apache-spark spark-streaming


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2016-04-26
    • 2016-12-13
    • 2019-04-10
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多