Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法

长度窗口实现原理图

说明:

上图长度窗口为5,事件W1至W5进入引擎后属于NewEvents队列,事件W6进入引擎后,W2至W6就属于NewEvents队列,而事件W1就属于OldEvents队列了。NewEvents为先进先出队列,队列长度为EPL语句中制定的长度窗口大小,OldEvent队列为过期数据的存放队列。

EPL长度窗口示例

select count(*) as result from orderEvent.win:time_batch(3 sec)

 

时间窗口实现原理图

说明:

从此图可以看出,随着时间推移,每个进入到引擎的W事件都是newEvents,即Insert Stream。W后括号里的值为属性值(可忽略),超过EPL语句设置的时间窗口值的事件将进入OldEvent队列.

 

时间周期格式

year-part : (number|variable_name) ("years" | "year")
month-part : (number|variable_name) ("months" | "month")
week-part : (number|variable_name) ("weeks" | "week")
day-part : (number|variable_name) ("days" | "day")
hour-part : (number|variable_name) ("hours" | "hour")
minute-part : (number|variable_name) ("minutes" | "minute" | "min")
seconds-part : (number|variable_name) ("seconds" | "second" | "sec")
milliseconds-part : (number|variable_name) ("milliseconds" | "millisecond" |  "msec")

 

EPL时间窗口示例

// 统计最近三秒内获取的事件中salary的平均值
String epsql = "select avg(salary) as result from orderEvent.win:time(3 sec)";

 

数据类型转换(cast)

示例:

// avg(salary)默认返回为Double类型,cast(avg(salary),int)转换为int类型;
// 30秒内 salary 的平均值
String epsql = "select bean,name,cast(avg(salary),int) from orderEvent.win:time(3 msec)";

 

Annotation(注解)

  1. @Name 指定EPL的名称,参数只有一个。例如:@Name("MyEPL")
  2. @Description 对EPL进行描述,参数只有一个。例如:@Description("Hello World")
  3. @Tag 对EPL进行额外的说明,参数有两个,分别为Tag的名称和Tag的值,用逗号分隔。例如:@Tag(name="author",value="luonanqin")
  4. @Priority 指定EPL的优先级,参数只有一个,并且整数(可负可正)。例如:@Priority(10)
  5. @Drop 指定事件经过此EPL后不再参与其他的EPL计算,该注解无参数。
  6. @Hint 为EPL加上某些标记,让引擎对此EPL产生其它的操作,会改变EPL实例的内存占用,但通常不会改变输出。其参数固定,由Esper提供。
  7. @Audit EPL添加此注解后,可以额外输出EPL运行情况,有点类似日志的感觉(当然没有日志的功能全啦)。
  8. @Hook 与SQL相关。
  9. @EventRepresentation 这是用来指定EPL产生的计算结果事件包含的数据形式。参数只有一个,即array=true或array=false。false为默认值,代表数据形式为Map,若为true,则数据形式为数组。

示例:

String epsql = "@Name(\"EsperEvent\")select avg(salary) from OrderEventMap.win:length_batch(2)";
 
    EPStatement epstate = epAdmin.createEPL(epsql);
    epstate.addListener(new orderListener());
    System.out.println("Name is ["+epstate.getName()+"]");

 

Expression(自定义函数)

格式:

Expression expression_name { expression_body }

expression_name为自定义的Expression名,expression_body为Expression的具体内容。

expression_body表现形式为:(input_param[,…] ]) => expression

input_param为事件流别名(不能和事件流同名)

示例:

// 创建转换函数 add
String expSql = "create expression add { x => x.salary+500 }";
// 将oe(orderEvent)事件流中的salary属性值加500
String epsql = "select add(oe) as s from orderEvent.win:length_batch(1) as oe";
 
EPStatement expstate = epAdmin.createEPL(expSql);
expstate.addListener(new orderListener());
EPStatement epstate = epAdmin.createEPL(epsql);
epstate.addListener(new orderListener());

 

自定义静态方法的应用

示例(事件流过滤)

// 判断总数是否等于0  
public class IsZero  
{  
    public static boolean isZero(int sum)  
    {  
        return sum==0;  
    }  
}  
  
10  // 加载  
11  epService.getEPAdministrator().getConfiguration().addImport(IsZero.class);  
12    
13  // 查询没有钱的用户的name值(User包含name和money属性)  
14  select name from orderEvent(IsZero.isZero(salary))

注意:

1、要过滤的属性只能是数字和字符串。

2、过滤表达式中不能使用聚合函数。

示例(事件流转换输出)

通过自定义类的静态方法转换事件流的输出属性。

BaseUntil.java(静态方法实现类)

public class BaseUntil {
   
    public static int Add(int n){
        return n+100;
    }
   
    public static String UpdataText(String str){
        return str+",你好!";
    }
10  }
11   
12  // 字节码加载  
13  epService.getEPAdministrator().getConfiguration().addImport(BaseUntil.class);
14   
15  String epsql = "select BaseUntil.UpdataText(name) as result from orderEvent  ";
时间: 2024-12-14 10:12:49

Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法的相关文章

Android学习系列(二)布局管理器之线性布局及其自定义实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39643669 LinearLayout是Android控件中的线性布局控件,它包含的子控件将以横向(HORIZONTAL)或竖向(VERTICAL)的方式排列,按照相对位置来排列所有的子控件及引用的布局容器.超过边界时,某些控件将缺失或消失.因此一个垂直列表的每一行只会有一个控件或者是引用的布局容器. 一.LinearLayout线性布局的相关属性说明: android:orientat

Esper事件处理引擎_10_EPL 语法___View 窗口视图条件语法

package com.framework_technology.esper.views; import com.framework_technology.esper.javabean.Apple; import com.java.annotation.document.Undigested; import com.java.annotation.document.Unfinished; import com.java.annotation.document.Unsolved; /**  * C

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

Skyline(6.x)-Web二次开发-多窗口对比

GitHub上获取源码 1.打开个3D窗口 一个页面加载多个TerraExplorer3DWindow和SGWorld等只有第一个能用(即使用iframe也是一样) 所以我决定打开两个新页面实现多窗口对比,然后我在<主页面>使用window.open打开了两个<新页面>,但这两个新页面使用SGWorld时居然在主页面(使用window.open的页面)产生了效果,感觉和以前的一个页面加载多个TerraExplorer3DWindow 和 SGWorld效果一样了!!! 然后经过测试

Wireshark入门与进阶系列(二)

摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 上一篇文章我们讲了使用Wireshark进行数据包捕获与保存的最基本流程,更通常的情况下,我们对于要捕获的数据包及其展示.存储可能有一定要求,例如: 我们希望捕获的数据包中对我们有用

Storm系列二: Storm拓扑设计

Storm系列二: Storm拓扑设计 在本篇中,我们就来根据一个案例,看看如何去设计一个拓扑, 如何分解问题以适应Storm架构,同时对Storm拓扑内部的并行机制会有一个基本的了解. 本章代码都在: [email protected]:zyzdisciple/storm_study.git 项目下的 user_behavior包下. 问题案例 有这样一种场景,在前端存在会话,我们会不断收到来自前端的消息,消息包含消息的发送时间,消息内容,结束标识, 消息的发送者, SessionId等其他信

Maven 系列 二 :Maven 常用命令,手动创建第一个 Maven 项目

1.根据 Maven 的约定,我们在D盘根目录手动创建如下目录及文件结构: 2.打开 pom.xml 文件,添加如下内容: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

Maven 系列 二 :Maven 常用命令,手动创建第一个 Maven 项目【转】

1.根据 Maven 的约定,我们在D盘根目录手动创建如下目录及文件结构: 2.打开 pom.xml 文件,添加如下内容: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

WPF入门教程系列二——Application介绍

原文:WPF入门教程系列二--Application介绍 一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只有一个 Application 实例存在.和 WinForm 不同的是WPF Application默认由两部分组成 : App.xaml 和 App.xaml.cs,这有点类似于 Asp.Net WebForm,将定义和行为代码相分离. 微