如何使用window.frequent?

时间:2015-11-23 10:27:13

标签: wso2 wso2cep siddhi

任何人都可以举个例子来说明如何使用window.frequent? 例如, 我写了一个测试,

"define stream cseEventStream (symbol string, price float, time long);" +
"" +
"@info(name = 'query1') " +
"from cseEventStream[700 > price]#window.frequent(3, symbol) " +
"select symbol, price, time " +
"insert expired events into outputStream;";

但是从outputStream,我无法找到规则。

感谢。

2 个答案:

答案 0 :(得分:1)

对于每个有价格&gt的事件; 700,此窗口将根据符号保留最常见的3个项目,因为输出类型是“过期事件”。只有当一个事件作为一个频繁的事件失去它的位置时,你才会收到输出。

Ex:适用于大小为2的频繁窗口

<强>输入

WSO2   1000    1
WSO2   1000    2
ABC     700    3
XYZ     800    4

<强>输出

ABC     700    3

ABC事件处于频繁窗口,并在收到XYZ事件后过期。如果您使用默认输出,那就是“当前事件”&#39;它将输出所有被选为频繁事件的传入事件并放入窗口。

实施基于 Misra-Gries 计数算法。

文档:https://docs.wso2.com/display/CEP400/Inbuilt+Windows#InbuiltWindows-frequent
测试用例:https://github.com/wso2/siddhi/blob/master/modules/siddhi-core/src/test/java/org/wso2/siddhi/core/query/window/FrequentWindowTestCase.java

答案 1 :(得分:1)

在此特定查询中window.frequent(3, symbol)&#39;将使查询找到最常见的3个符号(或3个具有最高出现次数的符号)。但是,当您向outputStream插入事件时,您只插入了 expired 事件。因此,作为最终结果,此查询将输出从频繁窗口过期的事件

在频繁的窗口中,过期事件是不再属于频繁组的事件。在这种情况下,作为符号的事件不在具有最高出现次数的3个符号中。

例如,如果您发送以下事件序列,

{"symbolA", 71.36f, 100}
{"symbolB", 72.36f, 100}
{"symbolB", 74.36f, 100}
{"symbolC", 73.36f, 100}
{"symbolC", 76.36f, 100}
{"symbolD", 76.36f, 100}
{"symbolD", 76.36f, 100}

查询将输出{"symbolA", 71.36f, 100}

当您使用&#39; symbolD&#39;发送活动时。 SymbolA将不再是出现次数最多的前三个符号之一,因此带有symbolA的事件已过期,并且{&#34; symbolA&#34;,71.36f,100}被发出。