我正在尝试实现一个管道并接收一个数据流,如果在分钟间隔中有任何元素,则每分钟输出一个True,如果没有,则输出False。如果持续时间内没有元素,则窗格(具有永久时间触发器)或窗口(固定窗口)似乎不会触发。
我想的一个解决方法是将流放入全局窗口,使用ValueState保持队列以累积数据,并使用计时器作为检查队列的触发器。我想知道是否有更简洁的方法来实现这一点。
感谢。
答案 0 :(得分:2)
我认为你的计时器和状态解决方案是一个很好的方法。但是,请记住,在收到密钥的至少一个元素之前,不会设置计时器。
如果这是一个问题,那么你可以做的另一件事就是注入一个PCollection,这样每个窗口都保证至少有一个虚拟元素。然后,您可以使用ValueState来检查虚拟元素之外的任何元素是否已到达。或者在窗口上使用Count.PerElement并检查该窗口是否有超过1个元素(一个附加元素,不是虚拟元素)。
答案 1 :(得分:0)
我相信您可以通过设置来实现此功能
.withAllowedLateness(Duration.ZERO, Window.ClosingBehavior.FIRE_ALWAYS)
在您的窗口化步骤中。
答案 2 :(得分:0)
我认为 Beam 人称这种模式为“循环计时器”(https://beam.apache.org/blog/looping-timers/,https://www.youtube.com/watch?v=Q_v5Zsjuuzg)。这个问题有几种解决方案,但也有一些权衡。
请务必阅读细则!例如,在撰写本文时(21 年 1 月),Google Cloud Dataflow Runners Drain 功能不支持循环计时器,但将来可能会发生变化:https://beam.apache.org/documentation/runners/capability-matrix/