我有一个Google Dataflow作业,该作业从PubSub读取数据,聚合数据,最后将数据发送到InflluxDB。我要实现的是在1分钟的窗口中聚合数据,但是每分钟在DB中只有一个条目。问题是我想允许延迟数据,所以我需要在5分钟的时间内累积数据,然后将唯一的条目发送给DB。
有可能吗?我尝试使用下面的代码来做到这一点,但我没有得到想要的东西:
input.apply(Window
.<KV<String, String>>into(FixedWindows.of(Duration.standardMinutes(1)))
.triggering(
AfterProcessingTime
.pastFirstElementInPane()
.plusDelayOf(Duration.standardMinutes(5)))
.withAllowedLateness(Duration.standardMinutes(5))
.discardingFiredPanes()
答案 0 :(得分:1)
我已经在类似的question上进行了合作。您可以使用.triggering(Never.ever())
忽略发送ON TIME
窗格。然后,正如您已经在做的那样,将允许的延迟时间设置为5分钟以进行延迟记录。
将Window.ClosingBehavior
更改为FIRE_ALWAYS
也很重要。这样,我们可以解决没有迟到的数据但没有发出准时记录的情况。关闭窗口后,它将始终发出最终窗格,其中PaneInfo.isLast
设置为true。
因此,对于您的情况,代码将类似于:
input.apply(Window
.<KV<String, String>>into(FixedWindows.of(Duration.standardMinutes(1)))
.triggering(Never.ever())
.withAllowedLateness(Duration.standardMinutes(5), Window.ClosingBehavior.FIRE_ALWAYS)
.discardingFiredPanes()