35、Flink 的 WindowAssigner之滚动窗口示例

1、处理时间

无须设置水位线策略和时间戳分配。

bash 复制代码
input.keyBy(e -> e)
                .window(TumblingProcessingTimeWindows.of(Duration.ofSeconds(5)))
                .apply(new WindowFunction<String, String, String, TimeWindow>() {
                    @Override
                    public void apply(String s, TimeWindow timeWindow, Iterable<String> iterable, Collector<String> collector) throws Exception {
                        for (String string : iterable) {
                            collector.collect(string);
                        }
                    }
                })
                .print();

2、事件时间

需要设置水位线和分配时间戳。

bash 复制代码
DataStreamSource<String> input = env.socketTextStream("localhost", 8888);

        // 测试时限制了分区数,生产中需要设置空闲数据源
        env.setParallelism(2);

        // 事件时间需要设置水位线策略和时间戳
        SingleOutputStreamOperator<Tuple2<String, Long>> map = input.map(new MapFunction<String, Tuple2<String, Long>>() {
            @Override
            public Tuple2<String, Long> map(String input) throws Exception {
                String[] fields = input.split(",");
                return new Tuple2<>(fields[0], Long.parseLong(fields[1]));
            }
        });

        SingleOutputStreamOperator<Tuple2<String, Long>> watermarks = map.assignTimestampsAndWatermarks(WatermarkStrategy.<Tuple2<String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(0))
                .withTimestampAssigner(new SerializableTimestampAssigner<Tuple2<String, Long>>() {
                    @Override
                    public long extractTimestamp(Tuple2<String, Long> input, long l) {
                        return input.f1;
                    }
                }));
                
		watermarks.keyBy(e -> e.f0)
                .window(TumblingEventTimeWindows.of(Duration.ofSeconds(5)))
                .apply(new WindowFunction<Tuple2<String, Long>, String, String, TimeWindow>() {
                    @Override
                    public void apply(String s, TimeWindow timeWindow, Iterable<Tuple2<String, Long>> iterable, Collector<String> collector) throws Exception {
                        for (Tuple2<String, Long> input : iterable) {
                            collector.collect(input.f0);
                        }
                    }
                })
                .print();
相关推荐
276695829214 分钟前
tiktok 弹幕 逆向分析
java·python·tiktok·tiktok弹幕·tiktok弹幕逆向分析·a-bogus·x-gnarly
用户403159863966331 分钟前
多窗口事件分发系统
java·算法
用户403159863966334 分钟前
ARP 缓存与报文转发模拟
java·算法
萤火虫儿飞飞34 分钟前
从基础加热到智能生态跨越:艾芬达用创新重构行业价值边界!
大数据·人工智能·重构
seanmeng202234 分钟前
Apache Iceberg on AWS - 通过Firehose流式导入数据到Iceberg表
大数据
小林ixn37 分钟前
大一新手小白跟黑马学习的第一个图形化项目:拼图小游戏(java)
java
seanmeng202239 分钟前
Apache Iceberg on AWS - 理解Iceberg表格式
大数据
nbsaas-boot1 小时前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang
hi0_61 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
朝如青丝暮成雪_1 小时前
java的三大特征
java