Scala 弗林克流窗口触发器

Scala 弗林克流窗口触发器,scala,apache-flink,flink-streaming,Scala,Apache Flink,Flink Streaming,我有flink stream,我在某个时间窗口上计算一些事情,比如说30秒 这里发生的事情是,它给我的结果,我以前的窗口聚合以及 假设在前30秒我得到结果10 接下来的30秒,我想要一个新的结果,而不是最后一个窗口结果+新的 等等 因此,我的问题是如何获得每个窗口的新结果。您描述的功能可以在翻滚窗口中找到: 更多的细节和/或代码会有所帮助:)您需要使用触发器。您需要的是FIRE和PURGE(发射和删除窗口内容),默认flink触发器所做的是FIRE(发射和保留窗口内容) 要获得更深入的解释,请查

我有flink stream,我在某个时间窗口上计算一些事情,比如说30秒

这里发生的事情是,它给我的结果,我以前的窗口聚合以及

假设在前30秒我得到结果10

接下来的30秒,我想要一个新的结果,而不是最后一个窗口结果+新的 等等


因此,我的问题是如何获得每个窗口的新结果。

您描述的功能可以在翻滚窗口中找到:

更多的细节和/或代码会有所帮助:)

您需要使用触发器。您需要的是FIRE和PURGE(发射和删除窗口内容),默认flink触发器所做的是FIRE(发射和保留窗口内容)

要获得更深入的解释,请查看和

触发器确定窗口(由窗口赋值器形成)何时准备好由窗口函数处理。每个WindowAssigner都带有一个默认触发器。如果默认触发器不符合您的需要,可以使用触发器(…)指定自定义触发器

当触发器触发时,它可以触发或触发\u和\u清除。当FIRE保留窗口的内容时,FIRE\u和\u PURGE将删除其内容。默认情况下,预实现的触发器只触发而不清除窗口状态


这个问题我有点晚了,但我在OP上遇到了同样的问题。后来我发现我自己的代码中有一个bug。仅供参考,我的错误可以作为解决您问题的参考

// Old code (modified to be an example):
val tenSecondGrouping: DataStream[MyCustomGrouping] = userIdsStream
      .keyBy(_.somePartitionedKey)
      .window(TumblingProcessingTimeWindows.of(Time.of(10, TimeUnit.SECONDS)))
      .trigger(ProcessingTimeTrigger.create())
      .aggregate(new MyCustomAggregateFunc(new MyCustomGrouping()))
错误发生在新的MyCustomGrouping上:我无意中创建了一个singleton MyCustomGrouping对象,并在MyCustomAggregateFunc中重用它。随着更多滚动窗口的创建,后期的聚合结果变得疯狂!修复方法是在每次触发MyCustomAggregateFunc时创建新的MyCustomGrouping。因此:

// New code, problem solved
          ...
          .aggregate(new MyCustomAggregateFunc(() => new MyCustomGrouping())) 
// passing in a func to create new object per trigger

你可以让我们了解一下你的代码,比如说我用30秒的时间翻滚窗口,我想在每个窗口中做一些计算,然后把它传递给下一个窗口。我是否需要使用
ProcessingTimeTrigger.create()
PurgingTimeTrgger.create(ProcessingTimeTrigger.create())
。如果是30秒翻滚窗口…30秒后窗口内容不是已经消失了吗?如果是这样,我们可以只使用
ProcessingTimeTrigger.create()
?我不明白为什么窗口内容仍然存在?当你说窗口内容时,你是指属于窗口的事件还是窗口事件的计算结果?如果我使用PurgingTrigger,哪个将被清除?
// New code, problem solved
          ...
          .aggregate(new MyCustomAggregateFunc(() => new MyCustomGrouping())) 
// passing in a func to create new object per trigger