ApacheFlink,获取窗口中的最后一个事件

plupiseo  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(807)

我在做一个项目,我有一个窗口大小为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
是否有任何方法可以告诉我们当前元素是否是窗口中的最后一个元素?有什么方法可以告诉我们当前窗口是否完成(滑动前)?

m0rkklqb

m0rkklqb1#

从抽象触发器类(https://github.com/apache/flink/blob/master//flink-streaming-java/src/main/java/org/apache/flink/streaming/api/windowing/triggers/trigger.java)
简单的回答是“否”。对于添加到窗格中的每个元素,都会调用方法onelement。当一个元素被添加时,不可能知道它是否是最后一个元素,因为直到下一个元素出现时才知道该信息(我们可以看到它是在这个窗口中还是在下一个窗口中)。
但是,一种替代方法是检查元素是否足够接近窗口末尾(因为一个元素可以访问窗口,例如if(timestamp>window.getend-delta)。。。
然而,我想不出一个我会推荐这个的用例。如果您需要访问窗口中的最后一个元素,您可能只需要使用一个windowfunction,然后在apply方法中获取input iterable的最后一个元素(input.last)。

相关问题