MATCH_RECOGNIZE

✅ Azure 流分析 ✅ 构造事件流

MATCH_RECOGNIZE子句用于在数据流上搜索一组事件。 通过此子句,可以使用正则表达式和聚合方法定义事件模式,以验证和提取匹配项中的值。

以下示例显示了 MATCH_RECOGNIZE 子句的基本结构:

SELECT *
INTO output FROM input TIMESTAMP BY time
	MATCH_RECOGNIZE (
		LIMIT DURATION (minute, 1)
		PARTITION BY tollBoothId
		MEASURES
			Last(Toyota.LicensePlate) AS toyotaLicensePlate,
			Last(Lexus.LicensePlate) AS lexusLicensePlate
		AFTER MATCH SKIP TO NEXT ROW
		PATTERN (Toyota+ Ford* Lexus+)
		DEFINE
			Toyota AS Toyota.make = 'Toyota',
			Ford AS Ford.make = 'Ford',
			Lexus AS Lexus.make = 'Lexus'
	) AS T

MATCH_RECOGNIZE默认为 ONE ROW PER MATCH 的匹配输出,这是唯一可用的匹配输出。 这意味着匹配将为每个匹配生成一个行结果,并且不返回匹配的行。

语法

SELECT_star_query_definition
MATCH_RECOGNIZE (
	LIMIT DURATION (time_unit, time)
	PARTITION BY column_alias
	MEASURES
		expression AS column_alias [,...n]
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN ( <pattern_group> )
	DEFINE
		pattern_name AS boolean_expression [,…n]
) AS column_alias

<pattern_group> ::=
{
	<pattern_name_modifier> [ | <pattern_group> ]*
}
<pattern_name_modifier> ::=
{
	<pattern_atom> [ <pattern_atom> ]*
}
<pattern_atom> ::=
{
	[ pattern_name | ( <pattern_group> ) ] [ <pattern_modifier> ]?
}
<pattern_name> :: =
{
	name | .
}
<pattern_modifier> ::=
{
	* | + | ?
}

限制持续时间

限制持续时间用于定义要搜索的模式的时间范围。 事件按时间排序,可以在 SELECT 子句上使用 TIMESTAMP BY 来指定时间字段。

PARTITION BY

PARTITION BY 允许对匹配项进行键键,并通过列名进行分区。 匹配将发生在分区语句指定的每个唯一键上。 这使单个查询能够匹配所有键并生成单独的匹配项,每个键一对一。

匹配后跳到下一行

此 skip 子句定义从事件 S 开始匹配模式后,下一次尝试匹配模式将从事件 S+1 开始。 在这种情况下,匹配可以重叠,因为模式可以包含另一个模式的开始。 这是唯一可用的 skip 子句。

措施

MEASURES 用于使用聚合方法从匹配中定义投影的值。 例如,LAST(A.id) AS aid将输出在匹配命名为字段名称aid的模式A的所有事件上找到的最后id一个值。

分类器函数

分类器函数可在 MEASURES 中使用,以输出与输入事件匹配的模式名称。 该函数返回字符串列表,每个字符串都具有匹配事件的模式名称。

模式

该模式定义要通过数据流搜索的事件的正则表达式。 模式变量由用户定义并用空格分隔。 修饰符(例如 + ,可用于 * 在匹配事件时修改变量的频率)。

示例:

PATTERN (A+ (B | C))

此示例上的模式至少定义了一个变量 A ,后跟 BC 的串联。

模式限定符

模式限定符用于更改模式在数据流中的映射方式,定义模式需要匹配的次数才能有效。 可以使用以下限定符:

  • '*' - 零次或多次
  • “+” - 一次或多次
  • '?' – 零次或一次
  • “|” - 一种模式或另一种模式

示例:

PATTERN (A? B+)

此示例定义 A 0 或 1 次,后 跟 B 至少 一次。

定义

DEFINE 指定用于将模式变量与事件匹配的规则。 规则是来自数据流的聚合值的布尔表达式。

DEFINE
    A AS Last(A.bigint) > 5,
    B AS Last(A.bigint) < B.bigint

此示例定义 A 和 B 的规则 AB ,其中 A 的 LAST 值大于 5 ,其中 A的 LAST 值小于 B 的当前值。如果未对 DEFINE 表达式使用聚合函数,则当前事件将绑定到模式变量,例如,在 B.bigint 上, B 值来自正在计算的当前事件。

如果模式 A 在模式 B 之前定义,则只能按顺序访问定义的模式 ,A 不能引用 B

允许

...
DEFINE
A AS Last(A.value),
B AS Max(A.value) + Max(B.value),
...

不允许

...
DEFINE
A AS Last(A.value) + Last(B.Value),
B AS Max(A.value) + Max(B.value),
...

聚合方法

可以在 MEASURES 和 DEFINE 中使用以下聚合方法:

  • 最小值 – 到目前为止聚合的最小数。
  • 最大值 – 到目前为止聚合的最大数。
  • 第一个 – 聚合的第一个值。
  • 最后一个 – 到目前为止聚合的最后一个值。

示例:

重装高压罐是一个危险的过程,需要密切监测,因为坦克的压力增加也会增加温度,压力需要稳步增加,以便油箱在重新填充时冷却。

在此示例中,开发人员希望监视高压罐的重新填充,因为它开始增加压力。 坦克开始重新填充,不能在不到3分钟内增加双倍的压力,否则坦克过热,并可能导致灾难性故障。

以下查询可用于监视进度:

SELECT *
INTO output FROM input TIMESTAMP BY time
MATCH_RECOGNIZE (
	LIMIT DURATION (minute, 3)
	MEASURES
 		MAX(Dangerous.pressure) as pressure,
		Classifier() as patterns
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN (Normal+ Dangerous+)
	DEFINE
		Normal AS Normal.isFilling = 1,
		Dangerous AS Max(Dangerous.pressure) > 2* Max(Normal.pressure)
) AS T

此查询将 Normal 与填充罐的任何事件匹配,如果压力在 3 分钟内超过 普通 填充的两倍,则触发事件时, 危险模式的最大 压力读数。

局限性

  • 仅字段值可用于聚合。 聚合调用内无法调用任何函数。

    允许

    ...
    DEFINE
          A AS Max(A.value) > 5,
    ...
    

    不允许

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • 只能将单个字段作为输入参数提供给聚合函数。

    允许

    ...
        DEFINE
      	    A AS Max(A.value) > 5,
      ...    
    

    不允许

      ...
      DEFINE
          A AS Max(A.value1 + A.value2) > 5,
      ...
    

另请参阅