2019独角兽企业重金招聘Python工程师标准>>>

1.EPL语法简介

EPL全称Event Processing Language,是一种类似SQL的语言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同时用事件流代替了table作为数据源,并且能像SQL那样join,filtering和aggregation。除了select,EPL也有insert into,update,delete,不过含义和SQL并不是很接近。另外还有pattern和output子句,这两个是SQL所没有的。EPL还定义了一个叫view的东西,类似SQL的table,来决定哪些数据是可用的,Esper提供了十多个view,并且保证这些view可以被重复使用。而且用户还可以扩展view成为自定义view来满足需求。在view的基础上,EPL还提供了named window的定义,作用和view类似,但是更加灵活。

2.语法

大部分EPL语句都遵循以下格式

[annotations]
[expression_declarations]
[context context_name]
[insert into insert_into_def]
select select_list
from stream_def [as name] [, stream_def [as name]] [,...]
[where search_conditions]
[group by grouping_expression_list]
[having grouping_search_conditions]
[output output_specification]
[order by order_by_expression_list]
[limit num_rows]

3.时间周期

time-period : [year-part] [month-part] [week-part] [day-part] [hour-part] [minute-part] [seconds-part] [milliseconds-part]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中的使用:

select avg(price) from Fruit.win:time(5 minute 3 sec) //在5分3秒中统计price平均值。
select sum(account) from User output every 1 day //每天输出一次计算结果

Esper规定每月的天数都是30天,所以对准确性要求高的业务,以月为单位进行计算会出现误差的。

4.注解

EPL也可以写注解,种类不多,大部分简单而有效

// 不包含参数或者单个参数的注解
@annotation_name [(annotation_parameters)]// 包含多个属性名-值对的注解
@annotation_name (attribute_name = attribute_value, [name=value, ...])// 多个注解联合使用
@annotation_name [(annotation_parameters)] [@annotation_name [(annotation_parameters)]] [...]

具体注解

1)@Name 指定EPL的名称,参数只有一个。例如:@Name("MyEPL")

2)@Description 对EPL进行描述,参数只有一个。例如:@Description("This is MyEPL")

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,则数据形式为数组。

5.表达式

类似自定义函数,通常用Lambda表达式来建立的(也有别的方法建立),而Lambda表达式就一个“ => ”符号,表示“gose to”。符号的左边表示输入参数,符号右边表示计算过程,计算结果就是这个表达式的返回值,即Expression的返回值。

语法:

expression expression_name { expression_body }

expression是关键字,expression_name为expression的名称(唯一),expression_body是expression的具体内容。

expression_body语法格式:

expression_body: (input_param [,input_param [,...]]) => expression

例如:

expression middle { x => (x.max+x.min)/2 } select middle(apple) from Apple as apple

x表示输入参数,而x.max和x.min都是x代表的事件流的属性,如果事件流没这个属性,expression的定义就是错误的。

express的定义必须在使用它的句子之前完成。使用时直接写expression的名字和用圆括号包含要计算的参数即可。再次提醒,expression的参数只能是事件流别名,即apple,别名的定义就如上面那样,事件流之后跟着as,然后再跟别名。

多个expression情况

expression sumage { (x,y) => x.age+y.age } select sumage(me,you) from Me as me, You as you

全局表达式

对于expression里用另一个expression,EPL不允许在一个句子里建立两个expression,所以就出现了Global-Expression。普通的expression只作用于定义它的epl,如上面所有的包含select子句的epl就是如此。

create expression expression_name { expression_body }

和普通的expression相比,就是多了个create,不过他不能和别的子句放在一起,即他是单独执行的。

epService.getEPAdministrator().createEPL("create expression avgPrice { x => (x.fist+x.last)/2 }");

在expression使用全局expression

// 先定义全局的avgPrice
create expression avgPrice { x => (x.fist+x.last)/2 }// bananaPrice Banana事件中包含了first和last属性,否则将报错
expression bananaPrice{ x => avgPrice(x) } select bananaPrice(b) from Banana as b

转载:https://blog.csdn.net/luonanqin/article/details/11539221

转载于:https://my.oschina.net/u/3100849/blog/1936831

Esper学习笔记三:EPL语法(1)相关推荐

  1. Esper学习之五:EPL语法(一)

    转载请注明出处:http://blog.csdn.net/luonanqin 上篇说到了Esper的Context,要是不了解的同学请参看< Esper学习之四:Context >,看过的 ...

  2. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  3. python3语法都相同吗_python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样...

    python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样,IDLE shell编辑器,快捷键:ALT+p,上一个历史输入内容,ALT+n 下一个历史输入 ...

  4. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  5. Programming Languages PartA Week2学习笔记——SML基本语法

    Programming Languages PartA Week2学习笔记--SML基本语法 首先简单介绍使用的SML语言,参考维基百科和百度百科: ML(Meta Language:元语言)是由爱丁 ...

  6. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  7. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  8. 【AngularJs学习笔记三】Grunt任务管理器

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  9. 数组存储与指针学习笔记(三)指针与数组

    嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二)属性声明 GUN C编译器拓展语法学习笔记(三)内联函数.内建函数 ...

最新文章

  1. php 快速导出csv,php快速导出csv格式数据程序代码
  2. 挖机冬天施工不好启动?明火助燃为何不行?
  3. 蓝桥杯比赛常考算法_蓝桥杯总结-常用函数及算法
  4. 安装gcc 4.8.2 for cxx 11
  5. pstack 安装linux_详解命令-pstack
  6. 【Selenium-WebDriver自学】Selenium测试设计技术(十三)
  7. Java编程中的基本概念
  8. Zabbix中文模式:图片下面的字符乱码
  9. 配置python程序debug/run,避免每次运行都会重复加载数据集或模型,节约大量等待时间
  10. c++并发操作mysql_文件数据库sqlite3 C++ 线程安全和并发
  11. opencv ubuntu 汉字_ubuntu下没有中文输入法的解决办法
  12. 关关采集器如何配置代理ip【图文教程】
  13. 【技术贴】解决vss中提交pdf下载打开空白乱码
  14. IE浏览器卸载命令行
  15. 解决URP资源的材质成洋红色问题
  16. 巴厘岛7天6晚实用型游记
  17. 试题 算法训练 藏匿的刺客
  18. Vue实现一键截屏功能
  19. 详解色彩模型、色域以及颜色空间转换
  20. java计算机毕业设计的洗衣店订单管理系统源码+数据库+系统+lw文档+mybatis+运行部署

热门文章

  1. oracle 字段重命名大表,Oracle表字段的增、刪、改、表的重命名及主鍵的增、刪、改...
  2. jvm优化_Java中JVM,JIR,JRE和JDK之间的区别
  3. SpringBoot使用多线程处理任务
  4. EAUML日拱一卒-微信小程序实战:位置闹铃 (7)-在画面之间共享数据
  5. Список систем управления базами данных России в 2022 году
  6. 写给Krpano小白们的最最最入门级教程(二)
  7. 转动嘎吱嘎吱的脖子码下18.04.28.的总结
  8. 『phphot』【SD2.0大会】刘振飞:微软Office研发成功三大法宝
  9. LaBSE : Language-agnostic BERT Sentence Embedding
  10. python microbit typeerror_Microbit python无效语法