MATCH_RECOGNIZE (Stream Analytics)
Satsen MATCH_RECOGNIZE används för att söka efter en uppsättning händelser över en dataström. Med den här satsen kan du definiera händelsemönster med hjälp av reguljära uttryck och aggregeringsmetoder för att verifiera och extrahera värden från matchningen.
I följande exempel visas den grundläggande strukturen för en MATCH_RECOGNIZE-sats:
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 har matchande utdata på EN RAD PER MATCHning som standard, vilket är den enda matchning som är tillgänglig. Det innebär att matchningen ger ett resultat på en rad per matchning och inte returnerar de rader som matchas.
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> ::=
{
* | + | ?
}
BEGRÄNSA VARAKTIGHET
Gränsvaraktigheten används för att definiera ett tidsfönster för det mönster som mönstret ska sökas efter. Händelserna sorteras efter tid och TIMESTAMP BY kan användas i SELECT-satsen för att ange tidsfältet.
PARTITION EFTER
PARTITION BY tillåter att matchningen nyckelas och partitioneras över ett kolumnnamn. En matchning sker över varje unik nyckel som anges av partitionsinstruktionen. Detta gör att en enskild fråga kan matchas över alla nycklar och generera separata matchningar, en till varje nyckel.
EFTER MATCH HOPPA TILL NÄSTA RAD
Den här skip-satsen definierar att när ett mönster matchas med början vid händelse S, startar nästa försök att matcha mönstret vid händelse S+1. Matchningar kan överlappa i det här fallet eftersom ett mönster kan innehålla början av ett annat mönster inuti. Det här är den enda skip-satsen som är tillgänglig.
ÅTGÄRDER
MÅTT används för att definiera de beräknade värdena från matchningen med hjälp av aggregeringsmetoder. Returnerar till exempel LAST(A.id) AS aid
det senaste id
värdet som hittades för alla händelser som matchade mönstret med namnet A
i fältnamnet aid
.
Funktionen Klassificerare
Klassificerarfunktionen kan användas i MÅTT för att mata ut mönsternamn som matchas till indatahändelser. Funktionen returnerar en lista med strängar, var och en med mönsternamnet som matchade en händelse.
MÖNSTER
Mönstret definierar det reguljära uttrycket för händelser som ska genomsökas över dataströmmen. Mönstervariabler är användardefinierade och avgränsade med blanksteg. Modifierare som + och * kan användas för att ändra frekvensen för en variabel vid matchande händelser.
Exempel
PATTERN (A+ (B | C))
Mönstret i det här exemplet definierar en variabel A minst en gång, följt av en sammanfogning av antingen B eller C.
Mönsterkvantifierare
Mönsterkvantifierare används för att ändra hur ett mönster mappas i dataströmmen, vilket definierar hur många gånger ett mönster måste matcha för att vara giltigt. Följande kvantifierare är tillgängliga:
- '*' - Noll eller fler gånger
- '+' - En eller flera gånger
- '?' – Noll eller en gång
- '|' - Ett eller annat mönster
Exempel:
PATTERN (A? B+)
Det här exemplet definierar A 0 eller 1 tid följt av B minst en gång.
DEFINIERA
DEFINE anger de regler som används för att matcha en mönstervariabel med en händelse. Reglerna är booleska uttryck över aggregerade värden från dataströmmen.
DEFINE
A AS Last(A.bigint) > 5,
B AS Last(A.bigint) < B.bigint
I det här exemplet definieras regler A och B där LAST-värdet för A är större än 5 och B där LAST-värdet för A är mindre än det aktuella värdet för B. När du inte använder en mängdfunktion i DEFINE-uttryck binder den aktuella händelsen som utvärderas till mönstervariabeln, till exempel på B.bigint kommer B-värdet från den aktuella händelsen som utvärderas.
Definierade mönster kan bara nås i ordning, om mönster A definieras före mönster B kan A inte referera till B.
Tillåts
...
DEFINE
A AS Last(A.value),
B AS Max(A.value) + Max(B.value),
...
Inte tillåten
...
DEFINE
A AS Last(A.value) + Last(B.Value),
B AS Max(A.value) + Max(B.value),
...
Aggregeringsmetoder
Följande aggregeringsmetoder kan användas i MEASURES och DEFINE:
- Min – Det minsta antalet aggregerade hittills.
- Max – Det maximala antalet aggregerat hittills.
- First – Det första aggregerade värdet.
- Last – Det sista värdet aggregerat hittills.
Exempel:
Påfyllning av högtryckstankar är en farlig process och måste övervakas noga eftersom det ökande trycket på en tank också ökar temperaturen, trycket måste öka stadigt för att ge tid för tanken att svalna under påfyllning.
I det här exemplet vill utvecklaren övervaka påfyllningen av en högtryckstank när den börjar öka trycket. Tanken börjar fyllas på och kan inte öka trycket med sin dubbel på mindre än 3 minuter, annars överhettas tanken och kan orsaka ett katastrofalt fel.
Följande fråga kan användas för att övervaka förloppet:
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
Den här frågan matchar Normal för alla händelser som fyller tanken och om trycket är över dubbelt så stort som en normal fyllning inom 3 minuter, än en händelse utlöses med högsta tryckavläsning för dangerous-mönstret .
Begränsningar
Endast fältvärden kan användas för aggregeringar. Inga funktioner kan anropas i ett aggregeringsanrop.
Tillåts
... DEFINE A AS Max(A.value) > 5, ...
Inte tillåten
... DEFINE A AS Max(udf.myUdf(A.value)) > 5, ...
Endast ett fält kan anges till en mängdfunktion som indataparameter.
Tillåts
... DEFINE A AS Max(A.value) > 5, ...
Inte tillåten
... DEFINE A AS Max(A.value1 + A.value2) > 5, ...