java - 在 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 {
…
}
});
在上面的过滤转换中,它会通过元组的第一个字段的最大值进行过滤。有可能以某种方式做到这一点吗?
解决方案
使用 DataStream API,当您使用来自有限源(如文件)的数据时,当源到达其输入的末尾时,它会发送一个值为 MAX_WATERMARK 的水印。您可以使用它来检测工作是否已完成。
因此,在像您这样的情况下,您可以ProcessFunction
在 windows 之后放置一个,并让它不断地以状态存储它迄今为止收到的最新结果。为 MAX_WATERMARK 设置一个计时器,当它到达时,使用当时的状态来产生所需的结果。
这必须是 a KeyedProcessFunction
,否则您将无法使用计时器。如果流没有键控,则无论如何您都必须对其进行键控-假设您不介意并行性,您可以简单地通过常量键控。
推荐阅读
- sql - SQL中不同值之间的第一个更改值
- html - HTML Button 标记中的 IE-11 链接无法正常工作 - 如何修复?
- asp.net-mvc - Bundles/images/user-img-background.jpg 404(未找到)
- python - CRFSuite 有多少训练数据?
- json - 从 API 错误中获取数据,JSON 输入意外结束
- html - 为什么表格需要 width:0 来尊重列宽?
- java - FAIL - 无法启动上下文路径 /sagar 处的应用程序
- google-chrome - 谷歌登录按钮在 Chrome 中不起作用
- scala - scala导入库通配符
- javascript - Parse 获取没有任何实际数据的对象