1.事件流分析
EPL语句从一个或多个事件流中派生和聚合信息,加入或合并事件流,并将一个时间流的结果提供给后续的语句。EPL在select语句和where语句的使用上,和SQL很类似,不过,EPL语句用事件流和views替换了数据库的表格。和SQL中表格相似,views定义了可用于查询和过滤的数据。views可以表示一个事件流上的一个窗口。views也可以排序事件、从事件属性获取统计数据、进行事件分组或者处理唯一的事件属性值。
select avg(price) from StockTickEvent.win:time(30 sec);计算股票事件过去30s的平均价格。
select symbol, avg(price) as averagePrice from StockTickEvent.win:length(100) group by symbol;前100条股票事件的平均值
下面的例子关联了两个事件流。第一个事件流由欺诈告警事件组成,用于保存过去30分钟的事件信息。第二个流则是withdrawal事件,用来保存过去30秒的事件。这两个流通过account
number进行关联:
select fraud.accountNumber as accntNum,
fraud.warning as warn,
withdraw.amount as amount,
MAX( fraud.timestamp, withdraw.timestamp) as timestamp,
'withdrawlFraud' as desc from FraudWarningEvent.win:time(30 min) as fraud,
WithdrawalEvent.win:time(30 sec) as withdraw where fraud.accountNumber=withdraw.accountNumber</span>2.事件模式匹配
Event patterns match when an event or multiple events occur that match the pattern's definition.当符合模式定义的一个或多个事件发生时,就认为事件模式匹配了。
模式也可以是基于时间的。模式匹配是通过状态机实现的。
模式表达式可以由连接了模式操作符的过滤器表达式组成。通过在圆括号中的嵌入表达式,可以实现更深的模式表达式嵌套。
5类操作符:
- 控制模式探测器的创建和终止:every
- 逻辑操作符:and、or、not
- 操作事件顺序的时间操作符:->(紧跟着发生的,followed by)
- 过滤输出事件的where条件,引起模式探测器的终止:如,timer:within
- 和观察其他事件一样,观察者也观察时间事件,如,timer:interval,timer:at
//模式匹配的是在接下来60秒钟IBM股票值大于80的所有事件 every StockTickEvent(symbol="IBM", price>80) where timer:within(60 seconds)
//每小时的第5分钟给出提醒: every timer:at(5, *, *, *, *)
//当A事件发生时,如果后面跟的是B事件或C事件,则给出提醒(输出A事件) A -> ( B or C )
//匹配的是每一个EventX,如果后跟EventY事件,并且其objectID和EventX的objectID一样,则给出提醒(输出a事件): every a=EventX -> every b=EventY(objectID=a.objectID)
当检测到事件序列(或者没有事件发生)时,模式就会匹配。模式匹配的结果可以用于进一步的分析和处理。
下面的模式监测的是 Status事件发生后的10s没有相同ID的status事件发生的场景。整个EPL语句进一步计算了所有发生的每个ID的事件总数。
select a.id, count(*) from pattern [ every a=Status -> (timer:interval(10 sec) and not Status(id=a.id) ] group by id
命名窗口在引擎中是全局的数据窗口,其可以参与到很多的语句查询,并且可以被多个statement执行select、insert和delete操作。命名窗口和关系型数据库系统的表很相似。
通过下面的几步可以创建命名窗口:
create window AlertNamedWindow as (origin string, priority string, alarmNumber long)
当事件到达时,可以触发一个select、update或delete操作。下面是一个select应用,简单的统计数据窗口中的记录行总数:on TriggerEvent select count(*) from AlertNamedWindow
匹配-识别模式是一个基于正则表达式的模式匹配语法,是建议列入SQL的标准语法。
下面的匹配-识别模式,探测的是可能出现在事件中的模式,这些事件通过命名窗口(如上声明)保存。这个模式查找的是两个紧跟的事件,即事件之间没有相同的origin。第一个事件必须有一个“high”优先级,第二个事件必须是“medium”优先级。
select * from AlertNamedWindow
match_recognize (
partition by origin
measures a1.origin as origin, a1.alarmNumber as alarmNumber1, a2.alarmNumber as alarmNumber2
pattern (a1 a2)
define a1 as a1.priority = 'high',
a2 as a2.priority = 'medium' )
变量是一个标量、对象或者事件值,可用于所有的statement,包括模式。变量可以用在EPL中任意位置的表达式中。
总结
开发Esper应用时,事件类型建议采用Java类,对于事件信息的描述更为直观。在具有复杂关系的事件设计中,不建议使用Map的方式。
在EPL设计时,根据业务需求,如果能通过标准的SQL语法完成的,尽量不要使用匹配模式,因为在运行时,需要对Pattern进行额外的解析,其规则较SQL复杂,性能上有少许损耗。
数据窗口的使用,能够使得Esper处理更为复杂的应用场景,比如与分布式缓存、静态数据的使用等。变量不难理解,不管是高级的开发语言如java、C/C++,还是脚本语言如ruby、JS等,都有变量的概念,其使用范围,仅限于当前的Esper引擎实例。
后续文章会详细介绍本文所提的概念。
本文介绍了Esper中控制模式探测器的创建与终止,逻辑操作符如and、or、not,时间操作符如->和where条件。强调了避免过度使用匹配模式以优化性能,并提到了数据窗口在复杂应用场景中的作用,以及变量在Esper引擎实例中的应用。

283

被折叠的 条评论
为什么被折叠?



