我是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?
答案 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,用于计算每分钟数据的平均值。在你的问题中不清楚为什么需要模式表达式,所以我把它留了出来。