任何人都可以举个例子来说明如何使用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,我无法找到规则。
感谢。
答案 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}被发出。