我正在使用 Apache Flink Streaming API 来处理数据文件,并且我只想从最后一个窗口获取结果。有没有办法做到这一点?如果不可能,我想我可以过滤结果元组中第一个字段的最大值(Long 值)。
SingleOutputStreamOperator<Tuple12<Long, String, String, Integer, String, Integer, String, Integer, String, Integer, String, Integer>> top5SlidingEventTimeWindowsFiltered = top5SlidingEventTimeWindows.filter(new FilterFunction<Tuple12<Long,String,String,Integer,String,Integer,String,Integer,String,Integer,String,Integer>>() {
public boolean filter(
Tuple12<Long, String, String, Integer, String, Integer, String, Integer, String, Integer, String, Integer> value)
throws Exception {
…
}
});
在上面的过滤转换中,它将按元组第一个字段的最大值进行过滤。有可能以某种方式做到这一点吗?
最佳答案
使用 DataStream API,当您使用来自有限源(如文件)的数据时,当源到达其输入末尾时,它会发送一个值为 MAX_WATERMARK 的水印。您可以使用它来检测工作是否已完成。
因此,在像您这样的情况下,您可以在窗口后面放置一个 ProcessFunction ,并让它持续存储迄今为止收到的最新结果。为 MAX_WATERMARK 设置一个计时器,当它到达时,使用当时的状态来产生所需的结果。
这必须是一个KeyedProcessFunction
,否则您将无法使用计时器。如果流没有设置键控,那么您无论如何都必须设置键控——您可以简单地通过一个常量设置键控,假设您不介意并行度为 1。
关于java - 在 Apache Flink 中按元组字段中的 max 进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62445573/