我是beam pipeline的新手,我需要从通过Kafka主题(无限源(接收的事件中计算聚合统计数据(每个窗口的计数和持续时间,大约30分钟(。
事件
{"id":"xxxxx", "state": "start", "timestamp": 1625718600000, "device": "device-1", ...}
{"id":"xxxxx", "state": "end", "timestamp": 1625721300000, "device": "device-1",. ..}
{"id":"yyyyy", "state": "start", "timestamp": 1625718600000, "device": "device-2", ...}
{"id":"yyyyy", "state": "end", "timestamp": 1625719500000, "device": "device-2", ...}
事件"xxxxx";开始时间10:00,结束时间10:45
事件"yyyy";从10:00开始,到10:15结束
来自管道的预期统计
Device Interval Count Duration
device-1 10:00-10:30 1 30 min
device-2 10:00-10:30 1 15 min
device-1 10:30-11:00 0 15 min
我玩了固定窗口、触发器、groupByKey、CombineFn等,并且我成功地计算了聚合计数器,如果事件状态为",则递增计数;"开始">但是,即使在状态完全处理的情况下,我也不知道如何计算重叠窗口持续时间。
注意:在对事件进行分组时使用了事件标识符
请给我建议。
所以听起来你需要做的是计算同一个工作者的开始和结束事件来计算差异,对吧?
我想不出什么办法来做到这一点。
- 使用
GroupByKey
-您可以将偶数ID设置为键,并执行GroupByKey
以根据键对事件进行分组,并计算和输出差异 Stateful DoFn
-当您接收到事件时,将它们存储在由ID键控的状态中,当您存储时,检查另一个事件的可用性并计算差异
需要注意的一点是,开始和结束事件可能发生在两个不同的Windows中。在这种情况下,上述任何一种解决方案都不起作用,因为不同的Windows的计算方式不同。我认为你必须调整管道,以应对这种(罕见的?(情况。