Compartir a través de


MATCH_RECOGNIZE (Stream Analytics)

La cláusula MATCH_RECOGNIZE se usa para buscar un conjunto de eventos a través de un flujo de datos. Esta cláusula permite definir patrones de eventos mediante expresiones regulares y métodos agregados para comprobar y extraer valores de la coincidencia.

En el ejemplo siguiente se muestra la estructura básica de una cláusula 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 tiene una salida coincidente de ONE ROW PER MATCH como predeterminada, que es la única coincidencia disponible. Esto significa que la coincidencia genera un único resultado de fila por coincidencia y no devuelve las filas coincidentes.

Sintaxis

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> ::=
{
	* | + | ?
}

DURACIÓN LÍMITE

La duración del límite se usa para definir un período de tiempo en el que se va a buscar el patrón. Los eventos se ordenan por hora y TIMESTAMP BY se puede usar en la cláusula SELECT para especificar el campo de hora.

PARTITION BY

PARTITION BY permite que la coincidencia se almacene en clave y particione en un nombre de columna. Se producirá una coincidencia en cada clave única especificada por la instrucción partition. Esto permite que una sola consulta coincida con todas las claves y generar coincidencias independientes, una a cada clave.

DESPUÉS DE QUE LA COINCIDENCIA VAYA A LA FILA SIGUIENTE

Esta cláusula skip define que, una vez que se coincide con un patrón a partir del evento S, el siguiente intento de coincidencia se iniciará en el evento S+1. Las coincidencias se pueden superponer en este caso, ya que un patrón puede contener el inicio de otro patrón dentro. Esta es la única cláusula skip disponible.

MEDIDAS

MEASURES se usa para definir los valores proyectados a partir de la coincidencia mediante métodos agregados. Por ejemplo, LAST(A.id) AS aid generará el último id valor que se encontró en todos los eventos que coincidan con el patrón denominado A en el nombre aiddel campo .

Función clasificadora

La función clasificadora se puede usar en MEASURES para generar nombres de patrón coincidentes con eventos de entrada. La función devuelve una lista de cadenas, cada una con el nombre de patrón que coincide con un evento.

PATTERN

El patrón define la expresión regular de los eventos que se van a buscar en el flujo de datos. Las variables de patrón son definidas por el usuario y separadas por espacios. Los modificadores como + y * se pueden usar para modificar la frecuencia de una variable al buscar coincidencias de eventos.

Ejemplo

PATTERN (A+ (B | C))

El patrón de este ejemplo define una variable A al menos una vez, seguida de una concatenación de B o C.

Cuantificadores de patrones

Los cuantificadores de patrones se usan para cambiar cómo se asigna un patrón en el flujo de datos, definiendo cuántas veces debe coincidir un patrón para que sea válido. Los cuantificadores siguientes están disponibles:

  • '*': cero o más veces
  • '+': una o varias veces
  • '?': cero o una vez
  • '|': un patrón u otro

Ejemplo:

PATTERN (A? B+)

En este ejemplo se define A 0 o 1 tiempo seguido de B al menos una vez.

DEFINIR

DEFINE especifica las reglas usadas para hacer coincidir una variable de patrón con un evento. Las reglas son expresiones booleanas sobre valores agregados del flujo de datos.

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

En este ejemplo se definen las reglas A y B donde el último valor de A es mayor que 5 y B donde EL ÚLTIMO valor de A es menor que el valor actual de B. Cuando no se usa una función de agregado en la expresión DEFINE, el evento actual que se evalúa se enlaza a la variable de patrón, por ejemplo, en B.bigint el valor B procede del evento actual que se está evaluando.

Solo se puede tener acceso a patrones definidos en orden, si el patrón A se define antes del patrón B, A no puede hacer referencia a B.

Permitido

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

No permitido

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

Métodos de agregación

Los métodos agregados siguientes se pueden usar en MEASURES y DEFINE:

  • Min: el número mínimo agregado hasta ahora.
  • Max: número máximo agregado hasta ahora.
  • En primer lugar: el primer valor agregado.
  • Last: el último valor agregado hasta ahora.

Ejemplo:

El llenado de tanques de alta presión es un proceso peligroso y debe supervisarse estrechamente a medida que aumenta la presión en un tanque también aumenta su temperatura, la presión debe aumentar constantemente para dar tiempo para que el tanque se enfríe mientras se rellena.

En este ejemplo, el desarrollador quiere supervisar la recarga de un tanque de alta presión a medida que comienza a aumentar la presión. El tanque comienza a rellenarse y no puede aumentar la presión por su doble en menos de 3 minutos, de lo contrario, el tanque se sobrecalenta y podría causar un error catastrófico.

La consulta siguiente se puede usar para supervisar el progreso:

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

Esta consulta coincide con Normal con cualquier evento que llene el tanque y, en caso de que la presión sea superior al doble de un llenado Normal en un plazo de 3 minutos, que un evento se desencadena con la lectura de presión máxima para el patrón Peligroso .

Limitaciones

  • Solo se pueden usar valores de campo para agregados. No se puede llamar a ninguna función dentro de una llamada de agregado.

    Permitido

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

    No permitido

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Solo se puede proporcionar un único campo a una función de agregado como parámetro de entrada.

    Permitido

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

    No permitido

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

Consulte también