Condividi tramite


MATCH_RECOGNIZE (Analisi di flusso)

La clausola MATCH_RECOGNIZE viene usata per cercare un set di eventi in un flusso di dati. Questa clausola consente di definire modelli di evento usando espressioni regolari e metodi di aggregazione per verificare ed estrarre valori dalla corrispondenza.

Nell'esempio seguente viene illustrata la struttura di base di una clausola 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 ha un output corrispondente di ONE ROW PER MATCH come impostazione predefinita, ovvero l'unica corrispondenza disponibile. Ciò significa che la corrispondenza produce un singolo risultato di riga per corrispondenza e non restituisce le righe corrispondenti.

Sintassi

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

DURATA LIMITE

La durata limite viene usata per definire un intervallo di tempo in cui eseguire la ricerca del criterio. Gli eventi vengono ordinati in base all'ora e TIMESTAMP BY possono essere usati nella clausola SELECT per specificare il campo ora.

PARTITION BY

PARTITION BY consente la chiave e il partizionamento della corrispondenza su un nome di colonna. Una corrispondenza verrà eseguita su ogni chiave univoca specificata dall'istruzione di partizione. In questo modo, una singola query viene confrontata con tutte le chiavi e genera corrispondenze separate, una a ogni chiave.

AFTER MATCH SKIP TO NEXT ROW

Questa clausola skip definisce che una volta che un criterio viene confrontato a partire dall'evento S, il successivo tentativo di corrispondenza inizierà all'evento S+1. Le corrispondenze possono sovrapporsi in questo caso perché un criterio può contenere l'inizio di un altro modello all'interno. Questa è l'unica clausola skip disponibile.

MISURE

MEASURES viene usato per definire i valori proiettati dalla corrispondenza usando metodi di aggregazione. Ad esempio, LAST(A.id) AS aid restituirà l'ultimo id valore trovato su tutti gli eventi che corrispondono al modello denominato A nel nome aiddel campo .

Funzione di classificazione

La funzione di classificazione può essere usata in MEASURES per restituire i nomi dei criteri di output corrispondenti agli eventi di input. La funzione restituisce un elenco di stringhe, ognuna con il nome del criterio corrispondente a un evento.

PATTERN

Il criterio definisce l'espressione regolare di eventi in cui eseguire la ricerca nel flusso di dati. Le variabili di modello sono definite dall'utente e separate da spazi. Modificatori come + e * possono essere usati per modificare la frequenza di una variabile quando corrispondono agli eventi.

Esempio

PATTERN (A+ (B | C))

Il modello in questo esempio definisce una variabile A almeno una volta, seguita da una concatenazione di B o C.

Quantificatori di pattern

I quantificatori dei criteri vengono usati per modificare la modalità di mapping di un modello nel flusso di dati, definendo il numero di volte in cui un modello deve corrispondere per essere valido. Sono disponibili i quantificatori seguenti:

  • '*' - Zero o più volte
  • '+' - Una o più volte
  • '?' - Zero o una volta
  • '|' - Uno schema o un altro

Esempio:

PATTERN (A? B+)

In questo esempio viene definita un'ora 0 o 1 seguita da B almeno una volta.

DEFINISCI

DEFINE specifica le regole utilizzate per associare una variabile di modello a un evento. Le regole sono espressioni booleane sui valori aggregati del flusso di dati.

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

Questo esempio definisce le regole A e B in cui il valore LAST di A è maggiore di 5 e B dove IL valore LAST di A è minore del valore corrente di B. Quando non si usa una funzione di aggregazione nell'espressione DEFINE, l'evento corrente valutato viene associato alla variabile di pattern, ad esempio in B.bigint il valore B proviene dall'evento corrente valutato.

È possibile accedere ai modelli definiti solo in ordine, se il modello A è definito prima del modello B, A non può fare riferimento a B.

È consentito

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

Non consentito

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

Metodi di aggregazione

I metodi di aggregazione seguenti possono essere usati in MEASURES e DEFINE:

  • Min: numero minimo aggregato finora.
  • Max: numero massimo aggregato finora.
  • First: primo valore aggregato.
  • Last: ultimo valore aggregato finora.

Esempio:

Il riempimento di serbatoi ad alta pressione è un processo pericoloso e deve essere monitorato attentamente perché aumenta anche la pressione su un serbatoio aumenta la sua temperatura, la pressione deve aumentare costantemente per dare tempo per il serbatoio di raffreddarsi durante il riempimento.

In questo esempio, lo sviluppatore vuole monitorare il riempimento di un serbatoio ad alta pressione quando inizia ad aumentare la pressione. Il serbatoio inizia a ricaricare e non può aumentare la pressione del suo doppio in meno di 3 minuti, altrimenti il surriscaldamento del serbatoio e potrebbe causare un guasto irreversibile.

È possibile usare la query seguente per monitorare lo stato di avanzamento:

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

Questa query corrisponde a Normal a qualsiasi evento che riempie il serbatoio e nel caso in cui la pressione sia superiore al doppio di un riempimento Normale entro 3 minuti, rispetto a un evento viene generato con la lettura massima della pressione per il modello Pericoloso .

Limitazioni

  • Solo i valori dei campi possono essere usati per le aggregazioni. Nessuna funzione può essere chiamata all'interno di una chiamata di aggregazione.

    È consentito

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

    Non consentito

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • È possibile fornire un solo campo a una funzione di aggregazione come parametro di input.

    È consentito

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

    Non consentito

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

Vedi anche