Siddhi CEP:在批处理时间窗口中聚合分组事件的字符串值

时间:2018-04-09 08:57:46

标签: aggregate wso2cep wso2-das siddhi

我使用Siddhi来减少系统中存在的事件数量。为此,我宣布了一个批处理时间窗口,它根据target_ip集中所有事件。

from Events#window.timeBatch(30 sec)
select id as meta_ID, Target_IP4 as target_ip
group by Target_IP4
insert into temp;

我想要的结果是每个target_ip的单个事件和meta_ID参数值作为形成事件的不同事件的串联。

问题是前一个查询生成的事件数与不同的meta_ID值一样多。例如,我正在

  1. " id_10"," target_1"
  2. " id_11"," target_1"
  3. 我想要

    1. " id_10,id_11"," target_1"
    2. 我知道我的查询中缺少一些聚合方法,我在Siddhi中看到了很多聚合函数,包括siddhi-execution-string扩展,它的方法是str:concat,但我不是&#39 ; t知道如何使用它来聚合meta_ID值。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以编写如下所示的执行计划,以达到您的要求:

define stream inputStream (id string, target string);

-- Query 1
from inputStream#window.timeBatch(30 sec)
select *
insert into temp;

-- Query 2
from temp#custom:aggregator(id, target) 
select *
insert into reducedStream;

此处,custom:aggregator是您必须实现的自定义流处理器扩展。实施时可以按[1]进行操作。

让我解释一下事情的运作方式:

查询1每30秒生成一批事件。换句话说,我们使用查询1来创建一批事件。

因此,在每30秒间隔结束时,一批事件将被送入自定义:聚合器流处理器。当流处理器收到输入时,它的process()方法将被命中。

@Override
    protected void process(ComplexEventChunk<StreamEvent> streamEventChunk, Processor nextProcessor, StreamEventCloner streamEventCloner, ComplexEventPopulater complexEventPopulater) {
        //implement the aggregation & grouping logic here
}

streamEventChunk中有一批事件。实现process()方法时,您可以遍历streamEventChunk并为每个目标创建一个事件。您需要在process()方法中实现此逻辑。

[1] https://docs.wso2.com/display/CEP420/Writing+a+Custom+Stream+Processor+Extension