Flink流媒体:获取每个时间窗口的前n个元素

时间:2016-09-01 05:56:21

标签: apache-flink flink-streaming

我有数据流的元组(Float,String),我想对每个时间窗(固定)进行排序和选择三个最大值。数据流的窗口化是通过处理时间和按自然顺序排序。

使用Flink 1.0.1,以下是我的尝试

          val topTasks = new mutable.PriorityQueue[(Float, String)](Ordering.Tuple2.reverse) //Ex:(5250, "mytask")
          //Get stream and other operations ...
          val sortMetricStream = metricStream
                       .map { metrics =>
                         topTasks.enqueue(metrics._1, metrics._2)
                       }
                       .timeWindowAll(Time.seconds(10))
                       .reduce({ (topTasks.dequeue()._2, topTasks.dequeue()._2, topTasks.dequeue()._2)
                       })

    val sortMetricStream = metricStream
                       .timeWindowAll(Time.seconds(10))
                       .partitionByRange(0)
                       .sortPartition(0, Order.DESCENDING)

在任何一个sortMetricStream中都没有给我预期的任务名称。

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用apply(...)代替reduce(...)(请参阅https://ci.apache.org/projects/flink/flink-docs-release-1.1/apis/streaming/index.html#datastream-transformations

通过使用WindowFunction#apply()的迭代器,您可以在内部缓冲窗口的所有记录(例如在列表中),然后排序(列表),最后发出结果。您可以拨打Collector#collect()零,一或多次。