我有来自Kafka的数据流:
stream
.keyBy("key")
.window(<tumbling window of 5 mins>)
.aggregate(<aggFunc>, <function adding window key and start wd time>)
...
.addSink(sink)
1个窗口中的键数是动态的(窗口1具有3个键,窗口2具有4个键)。
窗口1输出:例如5分钟-00:00到00:05。编号仅供以后参考,每个记录都是一个POJO,在这里我仅保留重要字段。
1. (<aggregated val>, key1, <window1-start-time)
2. (<aggregated val>, key2, <window1-start-time)
3. (<aggregated val>, key3, <window1-start-time)
窗口2输出:00:05至00:05-00:10
4. (<aggregated val>, key1, <window1-start-time)
5. (<aggregated val>, key3, <window2-start-time)
6. (<aggregated val>, key4, <window2-start-time)
7. (<aggregated val>, key5, <window2-start-time)
我想要的是:字符串(json对象列表)
[json-string(1), json-string(2), json-string(3)]
-> send to sink after window 1 fires
[json-string(4), json-string(5), json-string(6), json-string(7)]
-> send to sink after window 2 fires
我的接收器是HTTP请求的端点,该请求接受json负载。我想在一个窗口中批处理所有密钥,然后为每个窗口发送一次到接收器。 该怎么做?
我当前使用CountWindowAll,但这并不是最佳选择,因为countWindow可能包含来自2个窗口的数据。我在考虑申请后的另一个TublingWindow,但不知道 Flink如何在申请后获取时间戳。
我正在使用EventTime,它从Kafka记录中的一个字段派生时间戳。在应用运算符之后,该事件不再具有该时间戳记,而是Long windowStartTime。
答案 0 :(得分:0)
您可以在键控的TimeWindow后面跟随一个非键控的TimeWindowAll,它将所有第一个窗口的结果汇总在一起:
stream
.keyBy("key")
.window(<tumbling window of 5 mins>)
.aggregate(<aggFunc>, <function adding window key and start wd time>)
.windowAll(<tumbling window of 5 mins>)
.process(<function iterating over batch of keys for each window>)
.addSink(sink)
时间窗口发出的记录会自动加上时间戳,以允许应用另一层窗口。这可以用于汇总所有键的结果(如此处所示),也可以在不同的时间范围内生成键结果(例如,将5分钟的窗口合并为60分钟的窗口)。
Flink培训包含一个说明这种模式的exercise。