我想在水印到达窗口结尾x分钟后发出一个窗格。这让我确保可以处理一些较晚的数据,但仍只发出一个窗格。我目前正在使用Java。
目前,我找不到适合该问题的解决方案。当水印到达窗口的末端时,我可以发出一个窗格,但是所有后期数据都将被丢弃。我可以在窗口末尾发出窗格,然后在收到较晚的数据时再次发出窗格,但是在这种情况下,我不会发出单个窗格。
我目前有与此类似的代码:
unique(rbind(merge(Data, Values, by="Name",
merge(Data, Values, by="Code")
)
)
万一仍然令人困惑,我只想在水印通过.triggering(
// This is going to emit the pane, but I don't want emit the pane yet!
AfterWatermark.pastEndOfWindow()
// This is going to emit panes each time I receive late data, however
// I would like to only emit one pane at the end of the allowedLateness
).withAllowedLateness(allowedLateness).accumulatingFiredPanes())
时发出一个窗格。
答案 0 :(得分:1)
感谢Guillem,最后我用您的答案找到了这个very useful link,其中包含许多apap beam示例。由此,我提出了以下解决方案:
// We first specify to never emit any panes
.triggering(Never.ever())
// We then specify to fire always when closing the window. This will emit a
// single final pane at the end of allowedLateness
.withAllowedLateness(allowedLateness, Window.ClosingBehavior.FIRE_ALWAYS)
.discardingFiredPanes())
答案 1 :(得分:0)
首先,我要做的是将Window.ClosingBehavior
设置为FIRE_ALWAYS
。这样,当窗口永久关闭时,它将发送一个最终窗格(即使自最后一个窗格以来没有延迟记录),其PaneInfo.isLast
设置为true
。
然后,我将继续第二种选择:
我可以在窗口结尾处发射窗格,然后在我再次发射时 接收较晚的数据,但是在这种情况下,我不会发出任何数据 窗格。
但是在下游将不是最终的窗格丢弃,例如:
public void processElement(ProcessContext c) {
if (c.pane().isLast) {
c.output(c.element());
}
}