我有以下格式的数据,
SIP | 2405463430 | 4115474257 | 8.205142580136622E12 | Tue Nov 08 16:58:58 IST 2016 | INVITE RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | 08年11月 16:58:58 IST 2016 | 0 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 |星期二 11月16日16:58:58 IST 2016 | 1 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | Tue Nov 08 16:58:58 IST 2016 | 2 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | 08年11月 16:58:58 IST 2016 | 3 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 |星期二 11月16日16:58:58 IST 2016 | 4 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | Tue Nov 08 16:58:58 IST 2016 | 5 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | 08年11月 16:58:58 IST 2016 | 6 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 |星期二 11月08日16:58:58 IST 2016 | 7 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | Tue Nov 08 16:58:58 IST 2016 | 8 RTP | 2405463430 | 4115474257 | 8.205142580136622E12 | 08年11月 16:58:58 IST 2016 | 9 SIP | 2405463430 | 4115474257 | 8.205142580136622E12 |星期二 11月08日16:58:58 IST 2016 | BYE
我希望我的窗口在遇到SIP-INVITE
消息时启动,并在遇到SIP-BYE
消息时触发事件,执行一些聚合。
我该怎么做?对于给定用户,SIP-INVITE
消息随时会出现,我可能还会同时为多个用户发送多条SIP-INVITE
消息。
答案 0 :(得分:3)
我认为您可以使用由用户键入的全局窗口来解决您的用例。全局窗口收集每个键的所有数据,并将触发和清除窗口的责任推送到用户定义的Trigger
函数。
全局窗口定义如下:
val input: DataStream[(String, Int, String)] = ??? // (userId, value, marker)
val agg = input
// one global window per user (handles overlapping SIP-INVITE events).
.keyBy(_._1)
// collect all data for each user until the trigger fires and purges the window.
.window(GlobalWindows.create())
// you have to implement a custom trigger which reacts on the marker.
.trigger(new YourCustomTrigger())
// the window function computes your aggregation.
.apply(new YourWindowFunction())
我认为执行以下操作的触发器应该有效(假设SIP-INVITE
事件总是在启动会话)。 Trigger.onElement()
方法应检查SIP-BYE
字段并触发窗口评估并清除窗口,即返回TriggerResult.FIRE_AND_PURGE
。这将调用评估函数并删除窗口状态。
注意,如果要支持无序事件,则需要特别注意(在这种情况下,您应该将事件时间计时器设置为关闭元素的时间戳,以确保收到时间戳之前的所有数据) 。如果有数据应该被丢弃,因为它不是"之间的"您需要处理SIP-INVITE
和SIP-BYE
。
有关详细信息,请参阅global windows和triggers的文档,[Trigger][3]
的JavaDoc以及此blog post。