2

任何人都可以给我一个关于如何使用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 中,我找不到规则。

谢谢。

4

2 回答 2

1

对于价格 > 700 的每个事件,此窗口将保留基于符号的最频繁的 3 个项目,并且由于输出类型是“过期事件”,您将仅在事件失去其作为频繁事件的位置时才会收到输出。

例如:对于大小为 2 的频繁窗口

输入

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

输出

ABC     700    3

ABC 事件在频繁窗口中,并在收到 XYZ 事件时过期。如果您使用默认输出,即“当前事件”,它将输出所有被选为频繁事件的传入事件并放入窗口中。

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

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

于 2015-11-24T08:25:22.960 回答
1

在这个特定的查询中,' window.frequent(3, symbol)' 将使查询找到最频繁的 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}.

当您发送带有“symbolD”的事件时。SymbolA 将不再是出现次数最多的前 3 个符号之一,因此具有 symbolA 的事件已过期并发出 {"symbolA", 71.36f, 100}。

于 2015-11-24T08:53:46.007 回答