MATCH_RECOGNIZE (Stream Analytics)
Klauzula MATCH_RECOGNIZE służy do wyszukiwania zestawu zdarzeń za pośrednictwem strumienia danych. Ta klauzula umożliwia definiowanie wzorców zdarzeń przy użyciu wyrażeń regularnych i metod agregacji w celu weryfikowania i wyodrębniania wartości z dopasowania.
W poniższym przykładzie przedstawiono podstawową strukturę klauzuli 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 ma zgodne dane wyjściowe JEDEN WIERSZ NA DOPASOWANIE jako domyślne, co jest jedynym dostępnym dopasowaniem. Oznacza to, że dopasowanie generuje pojedynczy wynik wiersza na dopasowanie i nie zwraca dopasowanych wierszy.
Składnia
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> ::=
{
* | + | ?
}
LIMIT CZASU TRWANIA
Czas trwania limitu służy do definiowania przedziału czasu wyszukiwania wzorca. Zdarzenia są uporządkowane według czasu, a funkcja TIMESTAMP BY może być używana w klauzuli SELECT w celu określenia pola czasu.
PARTYCJONUJ WEDŁUG
FUNKCJA PARTITION BY umożliwia kluczowanie i partycjonowanie dopasowania za pośrednictwem nazwy kolumny. Dopasowanie zostanie wykonane za pośrednictwem każdego unikatowego klucza określonego przez instrukcję partycji. Umożliwia to dopasowanie pojedynczego zapytania do wszystkich kluczy i generowanie oddzielnych dopasowań, po jednym do każdego klucza.
PO DOPASOWANIU PRZEJDŹ DO NASTĘPNEGO WIERSZA
Ta klauzula skip definiuje, że po dopasowaniu wzorca rozpoczynającego się od zdarzenia S następne próby dopasowania wzorca będą rozpoczynać się od zdarzenia S+1. Dopasowania mogą nakładać się w tym przypadku, ponieważ wzorzec może zawierać początek innego wzorca wewnątrz. Jest to jedyna dostępna klauzula skip.
ŚRODKI
Miary służą do definiowania przewidywanych wartości na podstawie dopasowania przy użyciu metod agregacji. Na przykład LAST(A.id) AS aid
polecenie zwróci ostatnią id
wartość znalezioną dla wszystkich zdarzeń pasujących do wzorca o nazwie A
w nazwie aid
pola .
Classifier, funkcja
Funkcji klasyfikatora można używać w funkcji MIARy do nazw wzorców wyjściowych dopasowanych do zdarzeń wejściowych. Funkcja zwraca listę ciągów, z których każda ma nazwę wzorca zgodną ze zdarzeniem.
WZÓR
Wzorzec definiuje wyrażenie regularne zdarzeń, które mają być przeszukiwane za pośrednictwem strumienia danych. Zmienne wzorca są definiowane przez użytkownika i oddzielane spacjami. Modyfikatory, takie jak + i * , mogą służyć do modyfikowania częstotliwości zmiennej podczas dopasowywania zdarzeń.
Przykład
PATTERN (A+ (B | C))
Wzorzec w tym przykładzie definiuje zmienną A co najmniej raz, a następnie łączenie B lub C.
Kwantyfikatory wzorców
Kwantyfikatory wzorców służą do zmieniania sposobu mapowania wzorca w strumieniu danych, definiując, ile razy wzorzec musi być zgodny z prawidłowym wzorcem. Dostępne są następujące kwantyfikatory:
- '*' — zero lub więcej razy
- "+" — co najmniej jeden raz
- '?' — zero lub jeden raz
- '|' — jeden wzorzec lub inny
Przykład:
PATTERN (A? B+)
W tym przykładzie zdefiniowano wartość A 0 lub 1, po której następuje co najmniej raz B .
DEFINE
Define określa reguły używane do dopasowywania zmiennej wzorca do zdarzenia. Reguły są wyrażeniami logicznymi zagregowanymi wartościami ze strumienia danych.
DEFINE
A AS Last(A.bigint) > 5,
B AS Last(A.bigint) < B.bigint
W tym przykładzie zdefiniowano reguły A i B , gdzie wartość LAST A jest większa niż 5, a B , gdzie wartość LAST A jest mniejsza niż bieżąca wartość B. Jeśli nie używasz funkcji agregującej w wyrażeniu DEFINE, bieżące oceniane zdarzenie wiąże się ze zmienną wzorca, na przykład w przypadku funkcji B.bigint wartość B pochodzi z ocenianego bieżącego zdarzenia.
Dostęp do zdefiniowanych wzorców można uzyskać tylko w kolejności, jeśli wzorzec A jest zdefiniowany przed wzorcem B, A nie może odwoływać się do B.
Dozwolone
...
DEFINE
A AS Last(A.value),
B AS Max(A.value) + Max(B.value),
...
Niedozwolone
...
DEFINE
A AS Last(A.value) + Last(B.Value),
B AS Max(A.value) + Max(B.value),
...
Metody agregacji
Następujące metody agregacji mogą być używane w elementy MEASURES i DEFINE:
- Min — minimalna liczba zagregowana do tej pory.
- Max — maksymalna liczba zagregowana do tej pory.
- First — pierwsza zagregowana wartość.
- Last — ostatnia wartość zagregowana do tej pory.
Przykład:
Uzupełnianie zbiorników wysokiego ciśnienia jest niebezpiecznym procesem i musi być ściśle monitorowane, ponieważ zwiększenie ciśnienia na zbiorniku zwiększa również temperaturę, ciśnienie musi stale zwiększać się, aby zbiornik ochłodził się podczas uzupełniania.
W tym przykładzie deweloper chce monitorować uzupełnianie zbiornika wysokiego ciśnienia, gdy zaczyna zwiększać ciśnienie. Zbiornik rozpoczyna uzupełnianie i nie może zwiększyć ciśnienia o dwukrotnie w mniej niż 3 minuty, w przeciwnym razie przegrzewanie zbiornika i może spowodować katastrofalną awarię.
Następujące zapytanie może służyć do monitorowania postępu:
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
To zapytanie pasuje do normalnego zdarzenia, które wypełnia zbiornik i w przypadku, gdy ciśnienie jest ponad dwukrotnie normalne wypełnienie w ciągu 3 minut, niż zdarzenie jest wyzwalane z maksymalnym odczytem ciśnienia dla niebezpiecznego wzorca.
Ograniczenia
W przypadku agregacji można używać tylko wartości pól. Nie można wywoływać żadnych funkcji wewnątrz wywołania agregacji.
Dozwolone
... DEFINE A AS Max(A.value) > 5, ...
Niedozwolone
... DEFINE A AS Max(udf.myUdf(A.value)) > 5, ...
Jako parametr wejściowy można dostarczyć tylko jedno pole do funkcji agregującej.
Dozwolone
... DEFINE A AS Max(A.value) > 5, ...
Niedozwolone
... DEFINE A AS Max(A.value1 + A.value2) > 5, ...