更新时间:2022-12-07 GMT+08:00

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查询的其他部分所使用的表达式。

语法说明

表1 语法说明

参数

是否必选

说明

PARTITION BY

将数据行进行逻辑上的分组。

ORDER BY

在分区中对数据行进行逻辑排序。

[ONE ROW | ALL ROWS] PER MATCH

为每个匹配选择输出汇总或者明细。

  • ONE ROW PER MATCH:每次检测到完整的匹配后进行汇总输出。
  • 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

定义要匹配的模式。

  • 连续事件 PATTERN (A B C)即表示检测连续的ABC事件。
  • 逻辑事件PATTERN (A | B)即表示检测A或者B。
  • 修饰符
    • * :0次或多次迭代,如A* 匹配0次或多次A
    • + :1次或多次迭代,如A+ 匹配1次或多次A
    • ? :0次或1次迭代,如A? 匹配0次或多次A
    • {n} : n 次迭代 (n > 0),如A{5} 匹配5次A
    • {n,} : n 次或更多次迭代 (n >= 0),如A{5,} 匹配>=5次A
    • {n,m} : n次至m次 (包括n和m) 迭代 (0 <= n <= m, 0 < m),如A{3,6} 匹配3至6次A
    • {,m} : 0次至m次 (包括0和m) 迭代 (m > 0),如A{,4} 匹配0至4次A

DEFINE

定义主要的模式变量条件。

AFTER MATCH SKIP

定义在一个匹配找到之后从哪里开始下一轮匹配。

  • SKIP TO NEXT ROW :在当前匹配第一行之后的下一行开始下一轮模式匹配
  • SKIP PAST LAST ROW :在当前匹配的最后一行之后的下一行开始下一轮匹配
  • SKIP TO FIRST variable:从当前匹配的第一个variable开始下一轮匹配
  • SKIP TO LAST variable:从当前匹配的最后一个variable开始下一轮匹配
  • SKIP TO variable:同SKIP TO LAST variable

CEP支持的函数

表2 函数说明

函数

说明

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