java - 在 Apache Flink 中按元组字段中的 max 进行过滤

标签 java apache-flink flink-streaming flink-batch

我正在使用 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/

相关文章:

java - 在带有HBase的hadoop中使用外部jar

java - Spring的事务到线程

java - 在 Apache Flink Broadcast 流中应用基于窗口的规则

java - 弗林克 : how to write null values as empty through writeAsCsv in sink

java - Flink - 多源集成测试

java - 尝试 Spring Security 与 Jersey 我的 security-context.xml 文件有什么问题?

java - 在 Java 中发布带有日期字段的发件人时,未正确转换

amazon-s3 - 无法执行HTTP请求: Timeout waiting for connection from pool in Flink

scala - Flink 无法序列化 Scala 类/任务不可序列化

apache-flink - Apache Flink 示例作业无法以 "Job not found"运行