代码之家  ›  专栏  ›  技术社区  ›  Johnny

如何在CEP中实现连续时间窗口?

  •  1
  • Johnny  · 技术社区  · 9 年前

    假设我有一个事件流,我想能够计算一个时间窗口中有多少个事件。每当事件进入时间窗口并更改计数时,我都希望收到通知,当事件退出时间窗口时也是如此。

    下图显示了我的意思。我使用的是长度为4的时间窗口,我需要3个通知,一个是第一个事件进入窗口时,第二个是第二个事件进入时,第三个是第一事件退出时间窗口时。

    enter image description here

    如何进行这样的查询?如果我也想按事件的属性分组怎么办?

    以下是我目前所掌握的信息,但它不会在事件离开窗口时通知我: @config(async = 'true') define stream myStream (symbol string, timeStamp long) @info(name = 'query1') from myStream#window.externalTime(timeStamp,10 sec) select symbol, timeStamp, count(timeStamp) as eventCount group by symbol insert into outputStream 。这是针对SIddhi CEP的,但我想Esper也会类似。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Rajeev Sampath    9 年前

    在WSO2 CEP中的任何类型的窗口中,您都可以期待两种类型的事件。

    1. 当前事件-当新事件进入窗口时触发这些事件。i、 e.新事件本身被用作触发器
    2. 过期事件-当窗口中的现有事件退出时会触发这些事件。i、 e.如果时间窗口为1分钟,则每个事件保持1分钟,并在1分钟结束时发出

    您还可以在同一查询中使用这两种方法的组合,以从两种类型的事件中触发查询。

    在CEP 3.1.0中使用两种类型触发器的示例查询将是(检查 docs here ):

    from StockExchangeStream[symbol == 'WSO2']#window.time( 1 minute ) 
    select max(price) as maxPrice, avg(price) as avgPrice, min(price) as minPrice
    insert into WSO2StockQuote for all-events  
    

    如果您希望仅使用过期事件触发此事件,请使用“过期事件”代替“所有事件”。当前事件也是如此。如果未指定任何内容,则默认为当前事件,这就是为什么当前查询不会为过期事件触发的原因。

    注意,对于CEP 4.0.0,语法稍有不同,请检查 test source codes here (因为文档仍在进行中)。

    推荐文章