复杂事件处理(CEP)语句MATCH_RECOGNIZE,用于识别输入流中符合指定规则的事件,并按照指定方式输出。
语法
SELECT [ ALL | DISTINCT ]
{ * | projectItem [, projectItem ]* }
FROM tableExpression
[MATCH_RECOGNIZE (
[PARTITION BY {partitionItem [, partitionItem]*}]
[ORDER BY {orderItem [, orderItem]*}]
[MEASURES {measureItem AS col [, measureItem AS col]*}]
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS]
[AFTER MATCH SKIP]
PATTERN (patternVariable[quantifier] [ patternVariable[quantifier]]*) WITHIN intervalExpression
DEFINE {patternVariable AS patternDefinationExpression [, patternVariable AS patternDefinationExpression]*}
)];
参数 | 说明 |
---|---|
PARTITION BY | 分区的列,可选项。 |
ORDER BY | 可以指定多列,但是必须以EVENT TIME 或PROCESS TIME 列作为排序的首列,可选项。
|
MEASURES | 定义如何根据匹配成功的输入事件构造输出事件。 |
ONE ROW PER MATCH | 对于每一次成功的匹配,只产生一个输出事件。 |
ONE ROW PER MATCH WITH TIMEOUT ROWS | 除了匹配成功时产生的输出外,超时也会产生输出。超时时间由PATTERN语句中的WITHIN语句定义。
说明 Blink 3.6.0及以后版本,由于Calcite升级,不再支持ONE ROW PER MATCH WITH TIMEOUT ROWS参数。
|
ALL ROWS PER MATCH | 对于每一次成功的匹配,对应于每一个输入事件,都会产生一个输出事件。 |
ALL ROWS PER MATCH WITH TIMEOUT ROWS | 除了匹配成功时产生输出外,超时也会产生输出。超时时间由PATTERN语句中的WITHIN语句定义。
说明 Blink 3.6.0及以后版本,由于Calcite升级,不再支持ALL ROWS PER MATCH WITH TIMEOUT ROWS参数。
|
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS] | 可选项,默认为ONE ROW PER MATCH 。
|
AFTER MATCH SKIP TO NEXT ROW | 匹配成功后,从匹配成功的事件序列中的第一个事件的下一个事件开始进行下一次匹配。 |
AFTER MATCH SKIP PAST LAST ROW | 匹配成功后,从匹配成功的事件序列中的最后一个事件的下一个事件开始进行下一次匹配。 |
AFTER MATCH SKIP TO FIRST patternItem | 匹配成功后,从匹配成功的事件序列中第一个对应于patternItem的事件开始进行下一次匹配。 |
AFTER MATCH SKIP TO LAST patternItem | 匹配成功后,从匹配成功的事件序列中最后一个对应于patternItem的事件开始进行下一次匹配。 |
PATTERN | 定义待识别的事件序列需要满足的规则,需要定义在() 中,由一系列自定义的patternVariable构成。
说明
|
参数解释
- quantifier
quantifier用于指定符合patternVariable定义事件的出现次数。
参数 说明 * 0次或多次 + 1次或多次 ? 0次或1次 {n} n次 {n,} 大于等于n次 {n, m} 大于等于n次,小于等于m次 {,m} 小于等于m次 默认为贪婪匹配。例如,对于pattern: A -> B+ -> C
,输入为a bc1 bc2 c
(其中bc1和bc2表示既匹配B也匹配C),则输出为a bc1 bc2 c
。可以在quantifier符号后面加?来表示非贪婪匹配。例如:*?
+?
{n}?
{n,}?
{n, m}?
{,m}?
说明 Blink 3.x以上版本不支持(e1 e2+)贪婪匹配,您可以使用e1 e2+ e3 e3 as not e2绕行方案,但