CEP模式匹配
复杂事件处理(Complex Event Process,简称CEP)用来检测无尽数据流中的复杂模式,拥有从不同的数据行中辨识查找模式的能力。模式匹配是复杂事件处理的一个强大援助。
例子包括受一系列事件驱动的各种业务流程,例如在安全应用中侦测异常行为;在金融应用中查找价格、交易量和其他行为的模式。其他常见的用途如欺诈检测应用和传感器数据的分析等。
语法格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
MATCH_RECOGNIZE ( [ PARTITION BY expression [, expression ]* ] [ ORDER BY orderItem [, orderItem ]* ] [ MEASURES measureColumn [, measureColumn ]* ] [ ONE ROW PER MATCH | ALL ROWS PER MATCH ] [ AFTER MATCH ( SKIP TO NEXT ROW | SKIP PAST LAST ROW | SKIP TO FIRST variable | SKIP TO LAST variable | SKIP TO variable ) ] PATTERN ( pattern ) [ WITHIN intervalLiteral ] DEFINE variable AS condition [, variable AS condition ]* ) MR |
SQL中的模式匹配是用MATCH_RECOGNIZE子句执行。MATCH_RECOGNIZE子句执行如下任务:
- 使用PARTITION BY 和ORDER BY子句对MATCH_RECOGNIZE子句中的数据进行逻辑分区和排序。
- 使用PATTERN子句来定义要查找的数据行的模式。这些模式使用规则表达式语法。
- 使用DEFINE子句指定PATTERN模式变量所需的逻辑条件。
- 使用MEASURES子句定义度量,这是一些可在SQL查询的其他部分所使用的表达式。
语法说明
参数 |
是否必选 |
说明 |
---|---|---|
PARTITION BY |
否 |
将数据行进行逻辑上的分组。 |
ORDER BY |
否 |
在分区中对数据行进行逻辑排序。 |
[ONE ROW | ALL ROWS] PER MATCH |
否 |
为每个匹配选择输出汇总或者明细。
示例如下: SELECT * FROM MyTable MATCH_RECOGNIZE ( MEASURES AVG(B.id) as Bid ALL ROWS PER MATCH PATTERN (A B C) DEFINE A AS A.name = 'a', B AS B.name = 'b', C as C.name = 'c' ) MR 示例说明: 假设MyTable数据格式为(id,name), 有三条数据(1,a) (2,b), (3,c)。 那么ONE ROW PER MATCH会输出B的平均值2。 ALL ROWS PER MATCH会将每条记录及B的平均值输出,也就是输出(1,a, null), (2,b,2), (3,c,2)。 |
MEASURES |
否 |
定义要输出的度量值。 |
PATTERN |
是 |
定义要匹配的模式。
|
DEFINE |
是 |
定义主要的模式变量条件。 |
AFTER MATCH SKIP |
否 |
定义在一个匹配找到之后从哪里开始下一轮匹配。
|
CEP支持的函数
函数 |
说明 |
---|---|
MATCH_NUMBER() |
说明本次匹配属于第几次匹配。可用在MEASURES和DEFINE子句中。 |
CLASSIFIER() |
说明当前记录被匹配到PATTERN里的哪个模式变量里。可用在MEASURES和DEFINE子句中。 |
FIRST()/LAST() |
每次匹配里的第一个/最后一个记录。比如PATTERN (A B+ C), FIRST(B.id)代表匹配里的第一个B的id,LAST(B.id)代表匹配里的最后一个B的id。 |
NEXT()/PREV() |
相对偏移,可用在DEFINE里。比如PATTERN (A B+) DEFINE B AS B.price > PREV(B.price)。 |
RUNNING/FINAL |
RUNNING 表示匹配过程中间值,FINAL表示最终结果值,RUNNING/FINAL一般只在ALL ROWS PER MATCH里才有意义。比如有三条记录(a, 2), (b, 6), (c, 12), 那么RUNNING AVG(A.price)和FINAL AVG(A.price)的值就是(2, 6), (4, 6), (6, 6)。 |
聚合函数(COUNT, SUM, AVG, MAX, MIN) |
聚合操作,可用在MEASURES和DEFINE子句中。关于聚合函数的详细信息,请参见聚合函数。 |
示例
- 套牌车检测
5分钟内在不同区域的城市道路或者高速道路的摄像头采集到相同牌照的车辆数据,通过对号牌切换特征的模式匹配,实现套牌车检测。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
INSERT INTO fake_licensed_car SELECT * FROM camera_license_data MATCH_RECOGNIZE ( PARTITION BY car_license_number ORDER BY proctime MEASURES A.car_license_number as car_license_number, A.camera_zone_number as first_zone, B.camera_zone_number as second_zone ONE ROW PER MATCH AFTER MATCH SKIP TO LAST C PATTERN (A B+ C) WITHIN interval '5' minute DEFINE B AS B.camera_zone_number <> A.camera_zone_number, C AS C.camera_zone_number = A.camera_zone_number ) MR; |
该规则表示5分钟内在两个不同摄像区域内检测到同一车牌号车辆,为了防止出现误判,即车辆确实从A区域行驶到B区域,检查到B区域后A区域又检测到了该车牌,这种情况则认为是真正的套牌车。
输入数据:
浙B88888,zone_A 浙AZ626M,zone_A 浙B88888,zone_A 浙AZ626M,zone_A 浙AZ626M,zone_A 浙B88888,zone_B 浙B88888,zone_B 浙AZ626M,zone_B 浙AZ626M,zone_B 浙AZ626M,zone_C 浙B88888,zone_A 浙B88888,zone_A
则会输出:
浙B88888,zone_A,zone_B