我使用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值一样多。例如,我正在
我想要
我知道我的查询中缺少一些聚合方法,我在Siddhi中看到了很多聚合函数,包括siddhi-execution-string扩展,它的方法是str:concat,但我不是&#39 ; t知道如何使用它来聚合meta_ID值。有什么想法吗?
答案 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