Apache Beam窗口:考虑较晚的数据,但仅发出一个窗格

时间:2019-05-02 14:20:10

标签: java apache-beam dataflow windowing

我想在水印到达窗口结尾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()) 时发出一个窗格。

2 个答案:

答案 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());
    }
}