2013-07-24 56 views
1

我有UsersCount事件流包含連接的用戶數。 目前有一個查詢觸發時,用戶數由一段時間內,一定的百分比滴下來:Esper:後面跟着聚合標準

expression Disconnected { x => max(x.usersCount) - x.usersCount } 
expression DisconnectedPercent { x => Disconnected(x)/max(x.usersCount) * 100 } 
select usersCount, 
     max(usersCount) as maxUsersCount, 
     DisconnectedPercent(users) as disconnectedPercent, 
     Disconnected(users) as disconnectedCount 
from UsersCount.win:time(2 min) as users 
having DisconnectedPercent(users) >= 30 
    and Disconnected(users) >= 2 
output first every 10 minutes 

現在我需要提高查詢在幾秒鐘檢查是否用戶重新連接,即DisconnectedPercent擊出了一些負的閾值,例如:

select ... 
from pattern [every UsersCount(DisconnectedPercent >= 30) -> 
    (timer:interval(10 sec) and not UserCount(DisconnectPercent < -10)].win:time(2 min) 

現在我實施的解決方案需要兩條語句和一個額外的流。 聲明一個是:

expression Disconnected { x => max(x.usersCount) - x.usersCount } 
expression DisconnectedPercent { x => Disconnected(x)/max(x.usersCount) * 100 } 
insert into UsersDisconnectTrigger 
    select usersCount, 
      max(usersCount) as maxUsersCount, 
      Disconnected(users) as disconnectedCount, 
      DisconnectedPercent(users) as disconnectedPercent 
from UsersCount.win:time(5 minutes) as users 
having DisconnectedPercent(users) >= 30 and Disconnected(users) >= 10 

第二條語句註冊一個偵聽到的是:

select a.usersCount as usersCount, 
     a.maxUsersCount as maxUsersCount, 
     a.disconnectedCount as disconnectedCount, 
     a.disconnectedPercent as disconnectedPercent 
from pattern [every a=UsersDisconnectTrigger -> 
      (timer:interval(5 minutes) 
    and not b=UsersCount((usersCount - a.usersCount)/a.usersCount >= 20/100)))].win:time(5 minutes) 

有沒有辦法來編寫單獨的語句來檢測這樣的模式? 是否有可能如上選擇有意義的值?

回答

0

你想使用「插入」進行調查。 有第一條語句填充聚合值的流。 第二個語句消耗第一個語句流,當閾值超出時提醒。 有第三個語句消耗第一個語句的提示時,它的負數。

+0

是的,有兩個額外流的方法是顯而易見的。我正在尋找單一語句的解決方案,這是我們目前擁有的應用程序的限制 – rigal

相關問題