MATCH_RECOGNIZE (Stream Analytics)

La clause MATCH_RECOGNIZE est utilisée pour rechercher un ensemble d’événements sur un flux de données. Cette clause vous permet de définir des modèles d’événements à l’aide d’expressions régulières et de méthodes d’agrégation pour vérifier et extraire des valeurs de la correspondance.

L’exemple suivant montre la structure de base d’une clause 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 a une sortie correspondante d’UNE LIGNE PAR CORRESPONDANCE par défaut, qui est la seule correspondance disponible. Cela signifie que la correspondance produit un résultat de ligne unique par correspondance et ne retourne pas les lignes correspondantes.

Syntax

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

LIMITER LA DURÉE

La durée limite est utilisée pour définir une fenêtre de temps sur laquelle le modèle doit faire l’objet d’une recherche. Les événements sont classés par heure et TIMESTAMP BY peut être utilisé sur la clause SELECT pour spécifier le champ d’heure.

PARTITION BY

PARTITION BY permet à la correspondance d’être clé et partitionnée sur un nom de colonne. Une correspondance se produit sur chaque clé unique spécifiée par l’instruction de partition. Cela permet de mettre en correspondance une seule requête sur toutes les clés et de générer des correspondances distinctes, une à chaque clé.

APRÈS LA CORRESPONDANCE, PASSEZ À LA LIGNE SUIVANTE

Cette clause skip définit qu’une fois qu’un modèle est mis en correspondance à partir de l’événement S, la prochaine tentative de correspondance commence à l’événement S+1. Les correspondances peuvent se chevaucher dans ce cas, car un modèle peut contenir le début d’un autre modèle à l’intérieur. Il s’agit de la seule clause skip disponible.

MESURES

MEASURES est utilisé pour définir les valeurs projetées à partir de la correspondance à l’aide de méthodes d’agrégation. Par exemple, LAST(A.id) AS aid génère la dernière id valeur qui a été trouvée sur tous les événements qui correspondent au modèle nommé A en nom aidde champ .

Fonction classifieur

La fonction classifieur peut être utilisée dans MEASURES pour générer des noms de modèles correspondant à des événements d’entrée. La fonction retourne une liste de chaînes, chacune avec le nom de modèle correspondant à un événement.

PATTERN

Le modèle définit l’expression régulière des événements à rechercher sur le flux de données. Les variables de modèle sont définies par l’utilisateur et séparées par des espaces. Les modificateurs tels que + et * peuvent être utilisés pour modifier la fréquence d’une variable lors de la correspondance d’événements.

Exemple

PATTERN (A+ (B | C))

Le modèle de cet exemple définit une variable A au moins une fois, suivie d’une concaténation de B ou C.

Quantificateurs de modèle

Les quantificateurs de modèle sont utilisés pour modifier la façon dont un modèle est mappé dans le flux de données, en définissant le nombre de fois où un modèle doit correspondre pour être valide. Les quantificateurs suivants sont disponibles :

  • '*' : zéro ou plusieurs fois
  • '+' : une ou plusieurs fois
  • '?' : Zéro ou une seule fois
  • '|' - Un modèle ou un autre

Exemple :

PATTERN (A? B+)

Cet exemple définit A 0 ou 1 fois suivi de B au moins une fois.

DÉFINIR

DEFINE spécifie les règles utilisées pour faire correspondre une variable de modèle à un événement. Les règles sont des expressions booléennes sur des valeurs agrégées du flux de données.

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

Cet exemple définit des règles A et B où LA dernière valeur de A est supérieure à 5, et B où LAST value de A est inférieure à la valeur actuelle de B. Lorsque vous n’utilisez pas une fonction d’agrégation sur l’expression DEFINE, l’événement en cours d’évaluation est lié à la variable de modèle, par exemple, sur B.bigint , la valeur B provient de l’événement en cours d’évaluation.

Les modèles définis sont accessibles uniquement dans l’ordre, si le modèle A est défini avant le modèle B, A ne peut pas référencer B.

Autorisé

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

Non autorisé

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

Méthodes d'agrégation

Les méthodes d’agrégation suivantes peuvent être utilisées dans MEASURES et DEFINE :

  • Min : nombre minimal agrégé jusqu’à présent.
  • Max : nombre maximal agrégé jusqu’à présent.
  • First : première valeur agrégée.
  • Last : dernière valeur agrégée jusqu’à présent.

Exemple :

Le remplissage de réservoirs à haute pression est un processus dangereux qui doit être surveillé de près, car l’augmentation de la pression sur un réservoir augmente également sa température, la pression doit augmenter régulièrement pour laisser au réservoir le temps de se refroidir pendant le remplissage.

Dans cet exemple, le développeur souhaite surveiller le remplissage d’un réservoir à haute pression à mesure qu’il commence à augmenter la pression. Le réservoir commence à se remplir et ne peut pas augmenter la pression de son double en moins de 3 minutes, sinon le réservoir surchauffe et pourrait provoquer une défaillance catastrophique.

La requête suivante peut être utilisée pour surveiller la progression :

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

Cette requête correspond à Normal à tout événement qui remplit le réservoir et, dans le cas où la pression est supérieure au double d’un remplissage normal dans les 3 minutes, qu’un événement est déclenché avec la lecture de pression maximale pour le modèle Dangereux .

Limites

  • Seules les valeurs de champ peuvent être utilisées pour les agrégats. Aucune fonction ne peut être appelée à l’intérieur d’un appel d’agrégation.

    Autorisé

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

    Non autorisé

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Un seul champ peut être fourni à une fonction d’agrégation en tant que paramètre d’entrée.

    Autorisé

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

    Non autorisé

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

Voir aussi