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 aid
del 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, ...