我有一个siddhi查询,通过使用时间窗口窗口获取一分钟内的总事件数。使用输出流我正在更新条形图,其中包含常量值,x轴上的时间戳(日期和时间,直到分钟)以及y轴上的事件计数。
但有时候,一分钟内的事件数量需要花费太长时间才能传输,因此查询无法给出正确的结果。
例如,如果我得到总共60个事件,并且此查询首先给出了计数器显示在条形图中的数量,但是一分钟之后它将其值更改为20,这根据逻辑是正确的但我担心是否存在是一种我可以更新流的方式以及任何先前时间戳(在这种情况下为40 + 20)的条形图,并为其插入下一个即将到来的时间戳的新值。
我见过更新函数用于表而不是流,是这样吗? 而且我想要2个outputStreams从同一输入流填充两个不同的条形图。那么下面的查询是否正确?
查询是:
/* Enter a unique ExecutionPlan */
@Plan:name('FTPExecutionPlan')
/* Enter a unique description for ExecutionPlan */
-- @Plan:description('ExecutionPlan')
/* define streams/tables and write queries here ... */
@Import('FTPInStream:1.0.0')
define stream FTPInStream (ts string, uid string, id_orig_h string, id_orig_p int, id_resp_h string, id_resp_p int, user string, password string,command string, arg string, mime_type string, file_size string, reply_code int, reply_msg string);
@Export('FTPIPOutStream:1.0.0')
define stream FTPIPOutStream (ip_address string, ftp_requests int);
@Export('FTPOutStream:1.0.0')
define stream FTPOutStream (ts string, ftp_requests int);
from FTPInStream
select time:dateFormat(str:replaceAll(ts,'T',' '),'yyyy-MM-dd HH:mm', 'yyyy-MM-dd HH:mm:ss') as ts, uid, id_orig_h, id_orig_p, id_resp_h, id_resp_p
insert into intermediateStream;
from intermediateStream#window.timeBatch(1 min)
select ts, cast(count(ts), 'int') as ftp_requests
group by ts
insert into FTPOutStream;
from intermediateStream#window.timeBatch(1 min)
select id_orig_h as ip_address, cast(count(id_orig_h), 'int') as ftp_requests
group by id_orig_h
insert into FTPIPOutStream;
答案 0 :(得分:0)
但有时候,一分钟内的事件数量需要花费太长时间才能传输,因此查询无法给出正确的结果。
在上述情况下,您应该使用externalTimeBatch窗口,而不是timeBatch窗口。然后它将相对于事件的时间戳而不是实际时间处理事件批处理。
我见过更新函数用于表而不是流,是吗?
是。只有事件表具有删除/更新功能。事件流没有该功能。
我还想要2个outputStreams从同一个输入流中填充两个不同的条形图。那么下面的查询是否正确?
是。由于您要导出FTPOutStream和FTPIPOutStream,因此可以使用它们填充两个不同的条形图。