Flink - 没有以下事件时发出最后一个窗口

时间:2018-05-29 16:19:48

标签: apache-flink flink-streaming

我有一个包含事件p.to_csv(outputfile,delimeter= '|',encoding = 'utf-8) 的流,我想处理按(Id,Type)和活动会话分组的事件

例如,来自事件

Event(Id, Type, Date)

我希望有以下窗口:

Event1: Event(1, T1, 2018-01-24)
Event2: Event(2, T1, 2018-01-26)
Event3: Event(1, T2, 2018-01-28)
Event4: Event(1, T2, 2018-01-28)
...

根据我的理解,我应该能够在键控流上使用事件时间会话窗口。 但是使用我的代码,只打印包含第一个事件(Event1)的第一个窗口(Window1)。

Window1 with Event1
Window2 with Event2
Window3 with Event3 and Event4
...

这是处理历史事件和会话窗口的适当方式吗?

2 个答案:

答案 0 :(得分:1)

org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows是您想要的。与EventTimeSessionWindows不同,ProcessingTimeSessionWindows在经过Gap时间后立即触发,而无需等待下一个事件的到来。

答案 1 :(得分:0)

在您的情况下,问题是始终根据传入事件生成水印。如果没有传入事件,则水印不会进展。在您的示例中,仅发出Window1,因为仅对于Event1,还有另一个后续事件,其时间戳使Watermark超出会话间隙。对于剩下的三个事件,没有这样的元素。对于event3和event4,根本没有这样的事件。此外,因为流是键控元素,所以具有不同键的元素是独立处理的。在这种情况下,水印不会前进,因此不会发出窗口。