MATCH_RECOGNIZE (Stream Analytics)

Die MATCH_RECOGNIZE-Klausel wird verwendet, um nach einer Reihe von Ereignissen über einen Datenstrom zu suchen. Mit dieser Klausel können Sie Ereignismuster mithilfe von regulären Ausdrücken und Aggregatmethoden definieren, um Werte aus der Übereinstimmung zu überprüfen und zu extrahieren.

Das folgende Beispiel zeigt die grundlegende Struktur einer MATCH_RECOGNIZE-Klausel:

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 verfügt standardmäßig über eine übereinstimmende Ausgabe von ONE ROW PER MATCH. Dies ist die einzige verfügbare Übereinstimmung. Dies bedeutet, dass die Übereinstimmung ein einzelnes Zeilenergebnis pro Übereinstimmung erzeugt und nicht die übereinstimmenden Zeilen zurückgibt.

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

BEGRENZEN DER DAUER

Die Begrenzungsdauer wird verwendet, um ein Zeitfenster für das Muster zu definieren, nach dem gesucht werden soll. Die Ereignisse werden nach Zeit sortiert, und TIMESTAMP BY kann für die SELECT-Klausel verwendet werden, um das Zeitfeld anzugeben.

PARTITION BY

PARTITION BY ermöglicht es, die Übereinstimmung über einen Spaltennamen zu schlüsseln und zu partitionieren. Eine Übereinstimmung erfolgt über jeden eindeutigen Schlüssel, der in der Partitionsanweisung angegeben wird. Dadurch kann eine einzelne Abfrage über alle Schlüssel abgeglichen werden und separate Übereinstimmungen generiert werden, eine zu jedem Schlüssel.

NACH DEM ABGLEICH MIT DER NÄCHSTEN ZEILE FORTFAHREN

Diese Skip-Klausel definiert, dass der nächste Versuch, das Muster abzugleichen, bei Ereignis S+1 beginnt, sobald ein Muster abgeglichen wird. Übereinstimmungen können sich in diesem Fall überschneiden, da ein Muster den Anfang eines anderen Musters enthalten kann. Dies ist die einzige verfügbare Skip-Klausel.

MAßNAHMEN

MEASURES wird verwendet, um die projizierten Werte aus der Übereinstimmung mithilfe von Aggregatmethoden zu definieren. Gibt z. B. den letzten id Wert aus, der für alle Ereignisse gefunden wurde, LAST(A.id) AS aid die dem Muster mit dem Namen des A Feldnamens aidentsprechen.

Klassifizierungsfunktion

Die Klassifiziererfunktion kann in MEASURES verwendet werden, um Musternamen auszugeben, die mit Eingabeereignissen übereinstimmen. Die Funktion gibt eine Liste von Zeichenfolgen zurück, die jeweils den Musternamen aufweisen, der einem Ereignis entspricht.

PATTERN

Das Muster definiert den regulären Ausdruck von Ereignissen, die über den Datenstrom gesucht werden sollen. Mustervariablen sind benutzerdefinierte und durch Leerzeichen getrennt. Modifizierer wie + und * können verwendet werden, um die Häufigkeit einer Variablen beim Abgleich von Ereignissen zu ändern.

Beispiel

PATTERN (A+ (B | C))

Das Muster in diesem Beispiel definiert mindestens einmal eine Variable A , gefolgt von einer Verkettung von B oder C.

Muster quantifizierer

Musterquanter werden verwendet, um zu ändern, wie ein Muster im Datenstrom zugeordnet wird, und definieren, wie oft ein Muster übereinstimmen muss, um gültig zu sein. Die folgenden Quantifizierer sind verfügbar:

  • '*' – Null oder mehr Mal
  • "+" – Einmal oder mehrmals
  • '?' – Null oder einmal
  • '|' - Ein muster oder ein anderes

Beispiel:

PATTERN (A? B+)

In diesem Beispiel wird A 0 oder 1 mal definiert, gefolgt von B mindestens einmal.

DEFINE

DEFINE gibt die Regeln an, die zum Abgleichen einer Mustervariablen mit einem Ereignis verwendet werden. Die Regeln sind boolesche Ausdrücke gegenüber aggregierten Werten aus dem Datenstrom.

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

In diesem Beispiel werden die Regeln A und B definiert, wobei LAST-Wert von A größer als 5 und B ist, wobei LAST-Wert von A kleiner als der aktuelle Wert von B ist. Wenn keine Aggregatfunktion für den DEFINE-Ausdruck verwendet wird, wird das aktuelle ausgewertete Ereignis an die Mustervariable gebunden, z . B. bei B.bigint stammt der B-Wert aus dem aktuellen Ereignis, das ausgewertet wird.

Auf definierte Muster kann nur in der Reihenfolge zugegriffen werden. Wenn Muster A vor Muster B definiert ist, kann A nicht auf B verweisen.

Zulässig

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

Nicht zulässig

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

Aggregatmethoden

Die folgenden Aggregatmethoden können in MEASURES und DEFINE verwendet werden:

  • Min: Die mindestanzahl, die bisher aggregiert wurde.
  • Max: Die maximale Anzahl, die bisher aggregiert wurde.
  • First: Der erste aggregierte Wert.
  • Last – Der letzte bisher aggregierte Wert.

Beispiel:

Das Auffüllen von Hochdrucktanks ist ein gefährlicher Prozess und muss genau überwacht werden, da der zunehmende Druck auf einen Tank auch seine Temperatur erhöht, der Druck muss stetig steigen, damit der Tank beim Nachfüllen abkühlt.

In diesem Beispiel möchte der Entwickler das Nachfüllen eines Hochdruckbehälters überwachen, wenn der Druck erhöht wird. Der Tank beginnt mit dem Nachfüllen und kann den Druck in weniger als 3 Minuten nicht um seinen Doppelten erhöhen, da sonst der Tank überhitzt und zu einem katastrophalen Ausfall führen kann.

Die folgende Abfrage kann verwendet werden, um den Fortschritt zu überwachen:

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

Diese Abfrage gleicht Normal mit jedem Ereignis ab, das den Tank füllt, und wenn der Druck innerhalb von 3 Minuten über das Doppelte einer Normalfüllung liegt, als ein Ereignis mit dem maximalen Druckwert für das gefährliche Muster ausgelöst wird.

Einschränkungen

  • Für Aggregate können nur Feldwerte verwendet werden. Innerhalb eines Aggregataufrufs können keine Funktionen aufgerufen werden.

    Zulässig

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

    Nicht zulässig

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Nur ein einzelnes Feld kann einer Aggregatfunktion als Eingabeparameter bereitgestellt werden.

    Zulässig

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

    Nicht zulässig

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

Weitere Informationen