我有眨眼流,我在某个时间窗口说30秒钟就可以了解一些事情。
这里发生了什么,它给了我结果我聚合以前的窗口。
说前30秒我得到结果10。
下一个秒我想要新结果,而不是我得到最后一个窗口结果+新 等等。
所以我的问题是如何为每个窗口获得新的结果。
答案 0 :(得分:3)
您需要使用purging触发器。你想要的是FIRE_AND_PURGE(发出和删除窗口内容),默认的flink触发器做的是FIRE(发出并保持窗口内容)。
input
.keyBy(...)
.timeWindow(Time.seconds(30))
// The important part: Replace the default non-purging ProcessingTimeTrigger
.trigger(new PurgingTrigger[..., TimeWindow](ProcessingTimeTrigger))
.reduce(...)
如需更深入的解释,请查看Triggers和FIRE vs FIRE_AND_PURGE。
触发器确定何时窗口功能准备好处理窗口(由窗口分配器形成)。每个WindowAssigner都带有一个默认触发器。如果默认触发器不符合您的需要,您可以使用触发器(...)指定自定义触发器。
当触发器触发时,它可以是FIRE或FIRE_AND_PURGE。当FIRE 保留窗口内容时,FIRE_AND_PURGE 会删除其内容。默认情况下,预先实现的触发器只是FIRE而不会清除窗口状态。
答案 1 :(得分:0)
您所描述的功能可在Tumbling Windows中找到:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/windows.html#tumbling-windows
更多细节和/或代码会有所帮助:)
答案 2 :(得分:0)
这个问题我来不晚,但是我遇到了OP的同样问题。后来我发现是我自己的代码中的错误。仅供参考,我的错误可以为您的问题提供很好的参考。
// 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 :我无意中创建了一个单例MyCustomGrouping对象,并在MyCustomAggregateFunc中重用了该对象。随着创建更多滚动窗口,后来的聚合结果变得疯狂!解决方法是每次触发MyCustomAggregateFunc时都创建新的MyCustomGrouping。所以:
// New code, problem solved
...
.aggregate(new MyCustomAggregateFunc(() => new MyCustomGrouping()))
// passing in a func to create new object per trigger