Apache Flink,在窗口中获取最后一个事件

时间:2018-02-12 14:25:30

标签: apache scala apache-flink flink-streaming flink-cep

我正在开展一个项目,我有一个4天大小的窗口,步骤为1天

.timewindow(Time.days(4), Time.days(1))

我也有一个触发器

.trigger(new myTrigger)


onEventTime ---> Continue
onProccessingTime ---> Continue
clear ---> Purge
onElement---> (if element.isFinalTransaction) TriggerResult.FIRE_AND_PRUGE

isFinalTransaction是一个布尔值,当为true时,它调用FAP。 平均问题是如何让它返回true / false取决于元素是否是窗口中的最后一个

是否有任何方法可以告诉我们当前元素是否是窗口中的最后一个元素? 是否有任何方法可以告诉我们当前窗口是否完成(滑动前)?

1 个答案:

答案 0 :(得分:0)

来自抽象触发器类(https://github.com/apache/flink/blob/master//flink-streaming-java/src/main/java/org/apache/flink/streaming/api/windowing/triggers/Trigger.java

简短的回答是“否”。将为每个添加到窗格的元素调用onElement方法。添加元素后,就不可能知道它是否是最后一个元素,因为直到下一个元素出现(我们才能知道它是在此窗口中还是在下一个窗口中),该信息才为人所知。

但是,另一种方法是检查元素是否足够靠近窗口末端(因为onElement可以访问窗口,例如if(timestamp> window.getEnd-delta)...

但是,我想不出一个推荐使用的用例。如果需要访问窗口中的最后一个元素,则可能应该只使用WindowFunction并在apply方法中获取可迭代输入(input.last)的最后一个元素。