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 aid
del 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, ...