Apache flink Flink:在时间窗口中合并所有关键点的结果

Apache flink Flink:在时间窗口中合并所有关键点的结果,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有来自卡夫卡的数据流: stream .keyBy("key") .window(<tumbling window of 5 mins>) .aggregate(<aggFunc>, <function adding window key and start wd time>) ... .addSink(sink) 我的接收器是HTTP请求接受json负载的端点。我想在一个窗口中批量处理我所有的钥匙,并为每个窗口发送

我有来自卡夫卡的数据流:

stream
    .keyBy("key")
    .window(<tumbling window of 5 mins>)
    .aggregate(<aggFunc>, <function adding window key and start wd time>)
    ...
    .addSink(sink)
我的接收器是HTTP请求接受json负载的端点。我想在一个窗口中批量处理我所有的钥匙,并为每个窗口发送一次到水槽怎么做?

我目前使用CountWindowAll,但这不是最佳选择,因为countWindow可能包含来自两个窗口的数据。我正在考虑在应用后使用另一个TublingWindow,但不知道Flink在应用后如何派生时间戳


我使用的EventTime是从Kafka记录中的一个字段派生的时间戳。在应用运算符之后,事件不再有该时间戳记录,而是有一个较长的窗口开始时间。

您可以使用非键控时间窗口跟随键控时间窗口所有这些都会汇集第一个窗口的所有结果:

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)
流
.keyBy(“key”)
.window()

总数的(这说明了这种模式。

你能澄清一下你想完成什么吗?对于动态键,任何给定的窗口都只包含键的一个子集是正常的——你不需要做任何特殊的事情。至于时间戳,Flink不知道事件中的时间戳——当在事件时间中工作时,你的事件被包装在包含从时间戳提取器派生的时间戳的StreamRecords中。时间窗口发出时间戳设置为窗口结束时间的StreamRecords。只要第二个窗口的时间帧与第一个窗口的时间帧相同或倍数相同,您就可以跟随另一个时间窗口。@DavidAnderson,我刚刚编辑了这个问题,希望它能显示我的意图n更清晰。
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-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
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)