我们正在使用Flink来监控每个事件。详细信息场景是当事件到达时,flink在过去2小时内找到具有相同用户ID的所有事件并将计数字段求和。例如:
event1<userid1, n1, t0> -> real time result = n1
event2<userid2, n2, t0+1h> -> real time result = n2
event3<userid1, n3, t0+1h> -> real time result = n1+n3
event4<userid1, n4, t0+2.5h> -> real time result = n3+n4
我们怎样才能在flink中实现这样的场景?直觉上,我们想使用滑动窗口,但有两个问题:
答案 0 :(得分:0)
您可以继续使用滑动窗口,但使用您自己的Trigger
来发出到达窗口的元素。示例代码可能如下:
src.map(x => new Tuple2(x.id, x.value))
.keyBy(0)
.timeWindow(Time.seconds(2), Time.seconds(1))
.trigger(new Trigger[Tuple2[String, Int], TimeWindow] {
override def onEventTime(time: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
TriggerResult.CONTINUE
}
override def onProcessingTime(time: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
TriggerResult.FIRE
}
override def clear(window: TimeWindow, ctx: Trigger.TriggerContext): Unit = {
}
override def onElement(element: Tuple2[String, Int], timestamp: Long, window: TimeWindow, ctx: Trigger.TriggerContext): TriggerResult = {
TriggerResult.FIRE
}
})
.sum(1)
答案 1 :(得分:0)
您可以使用ProcessFunction
来实现此目的。 Here是详细信息。