Sdílet prostřednictvím


MATCH_RECOGNIZE (Stream Analytics)

Klauzule MATCH_RECOGNIZE slouží k vyhledání sady událostí v datovém streamu. Tato klauzule umožňuje definovat vzory událostí pomocí regulárních výrazů a agregačních metod k ověření a extrakci hodnot z shody.

Následující příklad ukazuje základní strukturu klauzule 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 má ve výchozím nastavení odpovídající výstup JEDEN ŘÁDEK NA SHODU, což je jediná dostupná shoda. To znamená, že shoda vytvoří jeden řádek výsledku na shodu a nevrací odpovídající řádky.

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

DOBA TRVÁNÍ LIMITU

Doba trvání limitu se používá k definování časového intervalu pro vzor, podle který se má hledat. Události jsou seřazené podle času a funkce TIMESTAMP BY je možné použít v klauzuli SELECT k zadání časového pole.

DĚLENÍ PODLE

FUNKCE PARTITION BY umožňuje, aby se shoda zaklíčovala a rozdělila na název sloupce. Ke shodě dojde u každého jedinečného klíče určeného příkazem partition. To umožňuje spárovat jeden dotaz na všechny klíče a generovat samostatné shody, jeden k každému klíči.

PO SHODĚ PŘESKOČIT NA DALŠÍ ŘÁDEK

Tato klauzule skip definuje, že jakmile je vzor spárován od události S, další vzor pokusu o shodu začne na události S+1. Shody se v tomto případě můžou překrývat, protože vzor může obsahovat začátek jiného vzoru uvnitř. Toto je jediná dostupná klauzule skip.

OPATŘENÍ

FUNKCE MEASURES se používá k definování předpokládaných hodnot z shody pomocí agregačních metod. Bude například LAST(A.id) AS aid výstupem poslední id nalezené hodnoty pro všechny události, které odpovídají vzoru s názvem A název aidpole .

Klasifikátor – funkce

Funkci klasifikátoru lze použít v nástroji MEASURES k výstupu názvů vzorů odpovídajících vstupním událostem. Funkce vrátí seznam řetězců, z nichž každý má název vzoru odpovídající události.

VZOR

Vzor definuje regulární výraz událostí, které se mají prohledávat v datovém proudu. Proměnné vzoru jsou definované uživatelem a oddělené mezerami. Modifikátory jako + a * lze použít ke změně frekvence proměnné při porovnávání událostí.

Příklad

PATTERN (A+ (B | C))

Vzor v tomto příkladu alespoň jednou definuje proměnnou A následovanou zřetězením B nebo C.

Kvantifikátory vzorů

Kvantifikátory vzorů se používají ke změně způsobu mapování vzoru v datovém streamu a definují, kolikrát se musí vzor shodovat, aby byl platný. K dispozici jsou následující kvantifikátory:

  • '*' – nula nebo vícekrát
  • +– jednou nebo vícekrát
  • '?' – Nula nebo jednou
  • | – jeden nebo druhý vzor

Příklad:

PATTERN (A? B+)

Tento příklad definuje A 0 nebo 1 čas následovaný B alespoň jednou.

DEFINE

DEFINE určuje pravidla, která se používají k přiřazení proměnné vzoru k události. Pravidla jsou logické výrazy nad agregovanými hodnotami z datového streamu.

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

Tento příklad definuje pravidla A a B , kde poslední hodnota A je větší než 5, a B , kde hodnota LAST A je menší než aktuální hodnota B. Pokud ve výrazu DEFINE nepoužíváte agregační funkci, aktuální událost, která se vyhodnocuje, se sváže s proměnnou vzoru, například u B.bigint , hodnota B pochází z aktuální události, která se vyhodnocuje.

K definovaným vzorům je možné přistupovat pouze v pořadí, pokud je vzor A definován před vzorem B, A nemůže odkazovat na B.

Povoleno

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

Nepovolené

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

Agregační metody

V nástrojích MEASURES a DEFINE můžete použít následující agregační metody:

  • Min – dosud agregovaný minimální počet.
  • Max – maximální agregovaný počet.
  • First – první agregovaná hodnota.
  • Last – zatím poslední agregovaná hodnota.

Příklad:

Doplňování vysokotlakých nádrží je nebezpečný proces a je třeba ho pečlivě sledovat, protože rostoucí tlak na nádrž také zvyšuje jeho teplotu, tlak se musí neustále zvyšovat, aby byl čas, aby se nádrž ochladla při doplňování.

V tomto příkladu chce vývojář monitorovat doplňování vysokotlaké nádrže, jakmile začne zvyšovat tlak. Nádrž se začne doplňovat a nemůže zvýšit tlak o svůj dvojitý za méně než 3 minuty, jinak se nádrž přehřívá a mohla by způsobit katastrofální selhání.

K monitorování průběhu můžete použít následující dotaz:

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

Tento dotaz porovná hodnotu Normal s jakoukoli událostí, která plní nádrž, a v případě, že je tlak vyšší než dvojnásobek normální náplně během 3 minut, než událost se aktivuje s maximálním odečtem tlaku pro nebezpečný vzor.

Omezení

  • Pro agregace lze použít pouze hodnoty polí. Uvnitř agregovaného volání nelze volat žádné funkce.

    Povoleno

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

    Nepovolené

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Jako vstupní parametr lze do agregační funkce zadat pouze jedno pole.

    Povoleno

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

    Nepovolené

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

Viz také