首页 > 解决方案 > 在 Apache Flink 的元组字段中按最大值过滤

问题描述

我正在使用 Apache Flink Streaming API 来处理数据文件,并且我对仅从最后一个窗口中获取结果感兴趣。有没有办法做到这一点?如果不可能,我想我可以过滤结果元组中第一个字段的最大值(长值)。

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 {
            …

        }
    });

在上面的过滤转换中,它会通过元组的第一个字段的最大值进行过滤。有可能以某种方式做到这一点吗?

标签: javaapache-flinkflink-streamingflink-batch

解决方案


使用 DataStream API,当您使用来自有限源(如文件)的数据时,当源到达其输入的末尾时,它会发送一个值为 MAX_WATERMARK 的水印。您可以使用它来检测工作是否已完成。

因此,在像您这样的情况下,您可以ProcessFunction在 windows 之后放置一个,并让它不断地以状态存储它迄今为止收到的最新结果。为 MAX_WATERMARK 设置一个计时器,当它到达时,使用当时的状态来产生所需的结果。

这必须是 a KeyedProcessFunction,否则您将无法使用计时器。如果流没有键控,则无论如何您都必须对其进行键控-假设您不介意并行性,您可以简单地通过常量键控。


推荐阅读