嗨:我需要在Siddhi流处理中实现以下重复数据删除逻辑。假设我有一个InputStream,我想生成如下的OutputStream:
(1)当事件是InputStream中的第一个事件(自事件处理引擎启动以来),将事件插入OutputStream。
(2)如果具有相同签名的事件(例如,相同的事件名称)在2分钟的窗口内到达,我们认为事件是相同的,我们不应该将事件插入到OutputStream中。否则,我们应该将事件插入到OutputStream中。
我尝试使用事件模式进行过滤。但是,我发现我无法表达"否定逻辑"在Siddhi中,即if(not(e1 - > e2在2分钟窗口中具有相同的签名))。是否有一种聪明的方法来执行此类事件重复数据删除逻辑?请注意,事件重复数据删除是事件处理所需的一种非常常见的表达方式。
如果我用Java实现它,那就相对简单了。我将创建一个哈希表。当第一个事件到达时,我将其注册到哈希能力,并将此注册事件的事件可接受时间设置为2分钟后。当下一个事件到来时,我查找哈希表,并将检索到的事件的可接受时间与我当前的事件时间进行比较,如果当前事件时间小于可接受的时间,我将不会将其视为输出事件。而不是Java实现,我更喜欢在Siddhi的流处理查询中实现声明性解决方案,如果可能的话。
答案 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 ;