我有数据流的元组(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中都没有给我预期的任务名称。
对此的任何帮助将不胜感激。
答案 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()
零,一或多次。