如何在Siddhi流处理中表达重复数据删除逻辑

时间:2018-06-14 22:35:07

标签: complex-event-processing wso2cep siddhi wso2sp drop-duplicates

嗨:我需要在Siddhi流处理中实现以下重复数据删除逻辑。假设我有一个InputStream,我想生成如下的OutputStream:

(1)当事件是InputStream中的第一个事件(自事件处理引擎启动以来),将事件插入OutputStream。

(2)如果具有相同签名的事件(例如,相同的事件名称)在2分钟的窗口内到达,我们认为事件是相同的,我们不应该将事件插入到OutputStream中。否则,我们应该将事件插入到OutputStream中。

我尝试使用事件模式进行过滤。但是,我发现我无法表达"否定逻辑"在Siddhi中,即if(not(e1 - > e2在2分钟窗口中具有相同的签名))。是否有一种聪明的方法来执行此类事件重复数据删除逻辑?请注意,事件重复数据删除是事件处理所需的一种非常常见的表达方式。

如果我用Java实现它,那就相对简单了。我将创建一个哈希表。当第一个事件到达时,我将其注册到哈希能力,并将此注册事件的事件可接受时间设置为2分钟后。当下一个事件到来时,我查找哈希表,并将检索到的事件的可接受时间与我当前的事件时间进行比较,如果当前事件时间小于可接受的时间,我将不会将其视为输出事件。而不是Java实现,我更喜欢在Siddhi的流处理查询中实现声明性解决方案,如果可能的话。

1 个答案:

答案 0 :(得分:0)

您可以使用内存表并实现这一目标;请在下面找到示例;它与您使用Java的方法非常相似。

    define stream InputStream (event_id string, data string);  
    define stream OutputStream (event_id string, data string);  
    define table ProcessedEvents (event_id string);

    from InputStream[not(ProcessedEvents.event_id == event_id in ProcessedEvents)]  
    insert into OutputStream ; 

    from OutputStream  
    select event_id  
    insert into ProcessedEvents ; 

    from OutputStream#window.time(2 sec)  
    select event_id  
    insert expired events into PurgeStream ; 

    from PurgeStream  
    delete ProcessedEvents  
       on ProcessedEvents.event_id == event_id ;