制作简单的Esper avg查询

时间:2013-12-16 17:55:31

标签: java sql esper

我是Esper的新手,我刚刚完成了教程,所以我有很多疑问。

我正在尝试进行查询,以计算所有数据源接收的信息的平均值。

首先,我有一个简单的查询,只打印出我收到的所有内容:

select * from pattern [every e=MyClass.Event]

然后我的下一步是计算平均值:

select avg(cast(value, float)) from pattern [every e=MyClass.Event]

但是我得到一个错误:

[ERROR] [2013-12-16 17:12:16,959] [qtp1609813298-11] net.jnd.thesis.helper.RoutesWrapper  - Error starting statement: Property named 'value' is not valid in any stream [select avg(cast(value, float)) from pattern [every e=net.jnd.thesis.camel.bean.CamelInternalEvent(sid=0 and sid<1387214056883)]]

这基本上意味着在使用这种格式时,我无法访问属性值。我知道一个事实,流只包含浮点数,所以我尝试了另一个版本的查询来计算所有内容的平均值:

select avg(*) from pattern [every e=MyClass.Event]

这也不起作用,因为显然使用avg(*)语法不正确。

我已重新阅读网站上的快速入门和教程,但无法找到能够帮助我的任何内容。如何编写一个查询,使我从所有数据源收到的所有值的AVG,Median或STDDEV?

1 个答案:

答案 0 :(得分:1)

在esper配置文件中告诉esper您正在使用的类。

<?xml version="1.0" encoding="UTF-8"?>
<esper-configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xmlns="http://www.espertech.com/schema/esper">

<event-type name="MyClass" class="package.MyClass"/>
</esper-configuration> 

您应该能够轻松处理事件流并计算平均值:

select avg(value) from MyClass

其中value是MyClass的公共属性或者getValue形式的getter。请注意,您需要以某种方式获取平均数据。一种简单的方法是在创建语句时使用update(float)方法注册对象。每次收到新事件时,Esper都会以新的平均值调用此值。 Esper解决方案页面上有一个类似的example statement,用于计算每分钟数据的平均值。在你的问题中不清楚为什么需要模式表达式,所以我把它留了出来。