Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:
controllo SQL di Databricks
Databricks Runtime 19.0 e versioni successive
Importante
Questa funzionalità è in versione beta. Gli amministratori dell'area di lavoro possono controllare l'accesso a questa funzionalità dalla pagina Anteprime . Vedere Gestire le anteprime di Azure Databricks.
Trova e filtra i modelli nelle righe del table_reference precedente.
MATCH_RECOGNIZE partiziona l'input, ordina le righe all'interno di ogni partizione, corrisponde a un criterio di riga rispetto a tale sequenza ordinata e restituisce risultati di riepilogo o per riga a seconda della modalità rows-per-match.
Gli usi tipici includono il rilevamento di esecuzioni di valori consecutivi, movimenti di prezzo a forma di V o W e sessioni di flussi di eventi.
Syntax
MATCH_RECOGNIZE (
[ PARTITION BY partition [, ...] ]
[ ORDER BY order_by ]
[ MEASURES measures ]
[ row_pattern_rows_per_match ]
[ AFTER MATCH row_pattern_skip_to ]
PATTERN ( row_pattern )
DEFINE row_pattern_definition_list )
measures
MEASURES { measureExpr AS measureName } [, ...]
row_pattern_rows_per_match
{ ONE ROW PER MATCH
| ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ] }
row_pattern_skip_to
SKIP PAST LAST ROW
Parameters
PARTITION BY partition [, ...]
Una o più espressioni che definiscono i gruppi di righe in cui vengono eseguiti i criteri di ricerca. Se si omette
PARTITION BY, la partizione contiene tutte le righe.PARTITION BYaccetta solo riferimenti a colonne. Se si specifica un'altra espressione, Azure Databricks genera MATCH_RECOGNIZE_PARTITION_BY_MUST_BE_COLUMN.ORDER BY order_by
Specifica l'ordine delle righe all'interno di ogni partizione. I criteri di ricerca e le funzioni di spostamento usano questo ordine.
-
Facoltativamente, definisce le colonne di misura restituite per ogni corrispondenza del criterio.
row_pattern_rows_per_match
Controlla il numero di righe restituite per corrispondenza. Il valore predefinito è
ONE ROW PER MATCH.ONE ROW PER MATCHRestituisce una riga per corrispondenza. Il risultato contiene solo colonne di partizione e colonne di misura.
ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ]Restituisce una riga per ogni riga che partecipa a una corrispondenza. Ogni riga di output include le colonne di input corrispondenti dalle
table_referencecolonne ,PARTITION BYeMEASURESdalle colonne calcolate per tale corrispondenza.SHOW EMPTY MATCHESviene accettato inALL ROWS PER MATCHe è l'impostazione predefinita quando si omette la sottosegola vuota di gestione delle corrispondenze. Questa versione non produce corrispondenze vuote, quindi la parola chiave non ha alcun effetto osservabile sul risultato.
AFTER MATCH row_pattern_skip_to
Specifica la riga da cui continuare dopo la ricerca di una corrispondenza. Questa versione supporta
SKIP PAST LAST ROWsolo . Continuare con la riga immediatamente successiva all'ultima riga della corrispondenza corrente. Si tratta dell'impostazione predefinita quando si omette laAFTER MATCHclausola .PATTERN ( row_pattern )
Specifica il criterio di corrispondenza.
DEFINE row_pattern_definition_list
Definisce le variabili booleane a cui si fa riferimento nelle
PATTERNclausole eMEASURES.
Result
Il risultato dipende dalla modalità rows-per-match:
ONE ROW PER MATCHRestituisce
PARTITION BYcolonne seguite daMEASUREScolonne.ALL ROWS PER MATCHRestituisce una riga per ogni riga che partecipa a una corrispondenza. Ogni riga di output include le colonne di input corrispondenti dalle
table_referencecolonne ,PARTITION BYeMEASURESdalle colonne calcolate per tale corrispondenza.
Condizioni di errore comuni
- MATCH_RECOGNIZE_EMPTY_MEASURES
- MATCH_RECOGNIZE_FUNCTION_OUTSIDE_MATCH_RECOGNIZE
- MATCH_RECOGNIZE_MEASURES_MUST_BE_ALIASED
- MATCH_RECOGNIZE_PARTITION_BY_MUST_BE_COLUMN
Examples
Ogni query usa una stock_ticker(symbol, tstamp, price) tabella, ad eccezione dell'ultimo esempio che usa page_views(user_id, event_time).
Esempio 1: Sequenza di aumento consecutiva
Trova tutte le esecuzioni massime di aumenti di prezzo consecutivi per simbolo. La variabile strt non ha alcuna DEFINE voce, quindi corrisponde a qualsiasi riga e ancora l'esecuzione.
up+ estende la corrispondenza tra uno o più aumenti consecutivi.
PREV(price) legge il prezzo della riga immediatamente precedente nell'ordine ORDER BY .
ONE ROW PER MATCH genera una singola riga di riepilogo per ogni esecuzione.
> CREATE OR REPLACE TEMP VIEW stock_ticker AS
SELECT * FROM VALUES
('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
('AAPL', TIMESTAMP '2024-01-01 09:31:00', 102.0),
('AAPL', TIMESTAMP '2024-01-01 09:32:00', 105.0),
('AAPL', TIMESTAMP '2024-01-01 09:33:00', 104.0),
('AAPL', TIMESTAMP '2024-01-01 09:34:00', 106.0),
('AAPL', TIMESTAMP '2024-01-01 09:35:00', 108.0)
AS t(symbol, tstamp, price);
> SELECT symbol, start_tstamp, end_tstamp, run_length
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(tstamp) AS end_tstamp,
COUNT(*) AS run_length
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt up+ )
DEFINE up AS price > PREV(price) ) AS T;
symbol start_tstamp end_tstamp run_length
AAPL 2024-01-01 09:30:00 2024-01-01 09:32:00 3
AAPL 2024-01-01 09:33:00 2024-01-01 09:35:00 3
Esempio 2: forma V (immersione e recupero)
Rilevare un prezzo che cade per primo, quindi aumenta.
down+ corrisponde alla gamba caduta e up+ al recupero.
LAST(down.tstamp) seleziona l'ultima riga classificata come down, ovvero il trough della V. Un riferimento qualificato da variabile, ad down.tstamp esempio , consente a un'espressione MEASURES di leggere le righe corrispondenti a una variabile di pattern specifica.
> SELECT symbol, start_tstamp, bottom_tstamp, end_tstamp
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(down.tstamp) AS bottom_tstamp,
LAST(tstamp) AS end_tstamp
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt down+ up+ )
DEFINE down AS price < PREV(price),
up AS price > PREV(price) ) AS T;
symbol start_tstamp bottom_tstamp end_tstamp
AAPL 2024-01-01 09:32:00 2024-01-01 09:33:00 2024-01-01 09:35:00
Esempio 3: Doppio inferiore (forma W)
Rilevare due dip separati da un recupero parziale. Il modello specifica quattro gambe (down1+ up1+ down2+ up2+) e i nomi di variabili distinti consentono di misurare o filtrare ogni passaggio in modo indipendente.
MATCH_NUMBER() numeri ogni W trovato all'interno di una partizione.
> CREATE OR REPLACE TEMP VIEW stock_ticker AS
SELECT * FROM VALUES
('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
('AAPL', TIMESTAMP '2024-01-01 09:31:00', 96.0),
('AAPL', TIMESTAMP '2024-01-01 09:32:00', 92.0),
('AAPL', TIMESTAMP '2024-01-01 09:33:00', 98.0),
('AAPL', TIMESTAMP '2024-01-01 09:34:00', 101.0),
('AAPL', TIMESTAMP '2024-01-01 09:35:00', 95.0),
('AAPL', TIMESTAMP '2024-01-01 09:36:00', 90.0),
('AAPL', TIMESTAMP '2024-01-01 09:37:00', 99.0),
('AAPL', TIMESTAMP '2024-01-01 09:38:00', 104.0)
AS t(symbol, tstamp, price);
> SELECT symbol, start_tstamp, end_tstamp, w_no
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(tstamp) AS end_tstamp,
MATCH_NUMBER() AS w_no
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt down1+ up1+ down2+ up2+ )
DEFINE down1 AS price < PREV(price),
up1 AS price > PREV(price),
down2 AS price < PREV(price),
up2 AS price > PREV(price) ) AS T;
symbol start_tstamp end_tstamp w_no
AAPL 2024-01-01 09:30:00 2024-01-01 09:38:00 1
Esempio 4: Sessione
Comprimere il flusso di eventi di un utente in sessioni, in cui una distanza di oltre 30 minuti tra gli eventi consecutivi inizia una nuova sessione.
strt apre una sessione in qualsiasi riga.
same_session* assorbe ogni evento seguente che si verifica entro 30 minuti dal suo predecessore. Quando un gap supera la soglia, la corrispondenza termina, AFTER MATCH SKIP PAST LAST ROW riprende all'evento successivo e inizia una nuova sessione (un nuovo MATCH_NUMBER()). Il * quantificatore rende un evento solitario una sessione di una riga valida.
> CREATE OR REPLACE TEMP VIEW page_views AS
SELECT * FROM VALUES
(1, TIMESTAMP '2024-01-01 09:00:00'),
(1, TIMESTAMP '2024-01-01 09:15:00'),
(1, TIMESTAMP '2024-01-01 10:00:00'),
(1, TIMESTAMP '2024-01-01 10:10:00')
AS t(user_id, event_time);
> SELECT user_id, session_no, session_start, session_end, event_count
FROM page_views
MATCH_RECOGNIZE (
PARTITION BY user_id
ORDER BY event_time
MEASURES MATCH_NUMBER() AS session_no,
FIRST(event_time) AS session_start,
LAST(event_time) AS session_end,
COUNT(*) AS event_count
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt same_session* )
DEFINE same_session AS event_time <= PREV(event_time) + INTERVAL 30 MINUTE ) AS T;
user_id session_no session_start session_end event_count
1 1 2024-01-01 09:00:00 2024-01-01 09:15:00 2
1 2 2024-01-01 10:00:00 2024-01-01 10:10:00 2