Delen via


MATCH_RECOGNIZE (Stream Analytics)

De MATCH_RECOGNIZE-component wordt gebruikt om te zoeken naar een set gebeurtenissen via een gegevensstroom. Met deze component kunt u gebeurtenispatronen definiëren met behulp van reguliere expressies en statistische methoden om waarden uit de overeenkomst te verifiëren en te extraheren.

In het volgende voorbeeld ziet u de basisstructuur van een MATCH_RECOGNIZE-component:

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 heeft standaard een overeenkomende uitvoer van ÉÉN RIJ PER OVEREENKOMST. Dit is de enige beschikbare overeenkomst. Dit betekent dat de overeenkomst één rijresultaat per overeenkomst produceert en niet de rijen retourneert die overeenkomen.

Syntaxis

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

LIMIETDUUR

De limietduur wordt gebruikt om een tijdvenster te definiëren voor het patroon waarop moet worden gezocht. De gebeurtenissen worden geordend op tijd en TIMESTAMP BY kan worden gebruikt voor de SELECT-component om het tijdveld op te geven.

PARTITIONEREN OP

MET PARTITION BY kan de overeenkomst worden gesleuteld en gepartitioneerd via een kolomnaam. Er vindt een overeenkomst plaats voor elke unieke sleutel die is opgegeven door de partitie-instructie. Hierdoor kan één query worden vergeleken met alle sleutels en afzonderlijke overeenkomsten worden gegenereerd, één voor elke sleutel.

NA OVEREENKOMST NAAR VOLGENDE RIJ OVERSLAAN

Deze skip-component definieert dat zodra een patroon wordt vergeleken vanaf gebeurtenis S, de volgende poging om het patroon te vinden, begint bij gebeurtenis S+1. Overeenkomsten kunnen in dit geval overlappen, omdat een patroon het begin van een ander patroon erin kan bevatten. Dit is de enige overslaan-component die beschikbaar is.

MAATREGELEN

METINGEN wordt gebruikt om de geprojecteerde waarden van de overeenkomst te definiëren met behulp van statistische methoden. Voert bijvoorbeeld LAST(A.id) AS aid de laatste id waarde uit die is gevonden voor alle gebeurtenissen die overeenkomen met het patroon met de naam A van het veld aid.

Classificatiefunctie

De classificatiefunctie kan worden gebruikt in METINGEN om patroonnamen uit te voeren die overeenkomen met invoergebeurtenissen. De functie retourneert een lijst met tekenreeksen, elk met de patroonnaam die overeenkomt met een gebeurtenis.

PATROON

Het patroon definieert de reguliere expressie van gebeurtenissen die moeten worden doorzocht via de gegevensstroom. Patroonvariabelen zijn door de gebruiker gedefinieerd en gescheiden door spaties. Modifiers zoals + en * kunnen worden gebruikt om de frequentie van een variabele te wijzigen bij het vergelijken van gebeurtenissen.

Voorbeeld

PATTERN (A+ (B | C))

Het patroon in dit voorbeeld definieert een variabele A ten minste eenmaal, gevolgd door een samenvoeging van B of C.

Patroonkwantificatoren

Patroonkwantificatoren worden gebruikt om te wijzigen hoe een patroon wordt toegewezen in de gegevensstroom, waarbij wordt gedefinieerd hoe vaak een patroon moet overeenkomen om geldig te zijn. De volgende kwantificatoren zijn beschikbaar:

  • *: nul of meer keren
  • '+' - Een of meer keren
  • '?' - Nul of één keer
  • | - Een patroon of een ander patroon

Voorbeeld:

PATTERN (A? B+)

In dit voorbeeld wordt A 0 of 1 keer gedefinieerd, gevolgd door B ten minste één keer.

DEFINE

MET DEFINE geeft u de regels op die worden gebruikt om een patroonvariabele aan een gebeurtenis te koppelen. De regels zijn Booleaanse expressies voor geaggregeerde waarden uit de gegevensstroom.

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

In dit voorbeeld worden regels A en B gedefinieerd, waarbij DE LAATSTE waarde van A groter is dan 5 en B waarbij DE LAATSTE waarde van A kleiner is dan de huidige waarde van B. Wanneer u geen statistische functie gebruikt in de DEFINE-expressie, wordt de huidige gebeurtenis die wordt geëvalueerd, gekoppeld aan de patroonvariabele, bijvoorbeeld op B.bigint , de B-waarde afkomstig is van de huidige gebeurtenis die wordt geëvalueerd.

Gedefinieerde patronen kunnen alleen in volgorde worden geopend. Als patroon A is gedefinieerd vóór patroon B, kan A niet verwijzen naar B.

Toegestaan

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

Niet toegestaan

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

Statistische methoden

De volgende statistische methoden kunnen worden gebruikt in METINGEN en DEFINE:

  • Min: het minimumaantal dat tot nu toe is geaggregeerd.
  • Max: het maximumaantal dat tot nu toe is geaggregeerd.
  • First: de eerste geaggregeerde waarde.
  • Last: de laatste waarde die tot nu toe is geaggregeerd.

Voorbeeld:

Het bijvullen van hogedruktanks is een gevaarlijk proces en moet nauwkeurig worden bewaakt als de toenemende druk op een tank ook de temperatuur verhoogt, de druk moet gestaag toenemen om de tank tijd te geven om af te koelen tijdens het bijvullen.

In dit voorbeeld wil de ontwikkelaar het bijvullen van een hogedruktank controleren naarmate de druk toeneemt. De tank begint bij te vullen en kan de druk niet in minder dan 3 minuten verdubbelen, anders raakt de tank oververhit en kan een catastrofale storing veroorzaken.

De volgende query kan worden gebruikt om de voortgang te controleren:

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

Deze query komt overeen met Normaal voor elke gebeurtenis die de tank vult en als de druk binnen 3 minuten meer dan het dubbele van een normale vulling is, wordt een gebeurtenis geactiveerd met de maximale drukwaarde voor het gevaarlijke patroon.

Beperkingen

  • Alleen veldwaarden kunnen worden gebruikt voor aggregaties. Er kunnen geen functies worden aangeroepen in een samengevoegde aanroep.

    Toegestaan

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

    Niet toegestaan

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Er kan slechts één veld worden opgegeven voor een statistische functie als invoerparameter.

    Toegestaan

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

    Niet toegestaan

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

Zie ook