Share via


Operatore di analisi

Analizza i dati, le corrispondenze e compila sequenze in base ai predicati.

I record corrispondenti vengono determinati in base ai predicati definiti nei passaggi dell'operatore. Un predicato può dipendere dallo stato generato dai passaggi precedenti. L'output per il record corrispondente è determinato dal record di input e dalle assegnazioni definite nei passaggi dell'operatore.

Sintassi

T| scan [ MatchIdColumnName ] [ declare=(with_match_idColumnDeclarations) ] with(StepDefinitions)

Sintassi ColumnDeclarations

Columnname:ColumnType[=DefaultValue ] [, ... ]

Sintassi StepDefinition

stepStepName [ output | last = none | all] :Condizione [ =>Assegnazionecolonna= [, ... ] ];

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria Descrizione
T string ✔️ Origine tabulare di input.
MatchIdColumnName string Nome di una colonna di tipo long aggiunta all'output come parte dell'esecuzione dell'analisi. Indica l'indice basato su 0 della corrispondenza per il record.
ColumnDeclarations string Dichiara un'estensione allo schema di T. Queste colonne vengono assegnate nei passaggi. Se non assegnato, viene restituito DefaultValue . A meno che non sia specificato diversamente, DefaultValue è null.
StepName string ✔️ Usato per fare riferimento ai valori nello stato di analisi per le condizioni e le assegnazioni. Il nome del passaggio deve essere univoco.
Condition string ✔️ Espressione che restituisce true o false che definisce i record dell'input corrispondenti al passaggio. Un record corrisponde al passaggio quando la condizione è true con lo stato del passaggio o con lo stato del passaggio precedente.
Assegnazione string Espressione scalare assegnata alla colonna corrispondente quando un record corrisponde a un passaggio.
output string Controlla la logica di output del passaggio sulle corrispondenze ripetute. all restituisce tutti i record corrispondenti al passaggio, last restituisce solo l'ultimo record in una serie di corrispondenze ripetute per il passaggio e none non restituisce i record corrispondenti al passaggio. Il valore predefinito è all.

Restituisce

Record per ogni corrispondenza di un record dall'input a un passaggio. Lo schema dell'output è lo schema dell'origine esteso con la colonna nella declare clausola .

Logica di analisi

scan supera i dati di input serializzati, record per record, confrontando ogni record rispetto alla condizione di ogni passaggio, tenendo conto dello stato corrente di ogni passaggio.

State

Lo stato sottostante dell'operatore scan può essere considerato come una tabella con una riga per ogni step. Ogni passaggio mantiene il proprio stato con i valori più recenti delle colonne e le variabili dichiarate da tutti i passaggi precedenti e il passaggio corrente. Se pertinente, contiene anche l'ID corrispondenza per la sequenza in corso.

Se un operatore di analisi ha n passaggi denominati s_1, s_2, ..., s_n quindi ilpassaggio s_k avrebbe i record k nello stato corrispondente a s_1, s_2, ..., s_k. StepName. Il formato ColumnName viene usato per fare riferimento a un valore nello stato. Ad esempio, s_2.col1 fare riferimento alla colonna col1 che appartiene al passaggio s_2 nello stato di s_k. Per un esempio dettagliato, vedere la procedura dettagliata per la logica di analisi.

Lo stato avvia vuoto e aggiorna ogni volta che un record di input analizzato corrisponde a un passaggio. Quando lo stato del passaggio corrente non viene interrotto, il passaggio viene definito con una sequenza attiva.

Logica di corrispondenza

Ogni record di input viene valutato rispetto a tutti i passaggi in ordine inverso, dall'ultimo passaggio al primo. Quando un record r viene valutato in base a alcuni passaggi s_k, viene applicata la logica seguente:

  • Controllare 1: Se lo stato del passaggio precedente (s_k-1) non viene interrotto e r soddisfa la condizione di s_k, si verifica una corrispondenza. La corrispondenza porta alle azioni seguenti:

    1. Lo stato di s_k viene cancellato.
    2. Lo stato di s_k-1 viene promosso a diventare lo stato di s_k.
    3. Le assegnazioni di s_k vengono calcolate ed estese r.
    4. L'oggetto r esteso viene aggiunto all'output e allo stato di s_k.

    Nota

    Se il controllo 1 genera una corrispondenza, il controllo 2 viene ignorato e r passa alla valutazione rispetto a s_k-1.

  • Controllare 2: Se lo stato di s_k ha una sequenza attiva o s_k è il primo passaggio e r soddisfa la condizione di s_k, si verifica una corrispondenza. La corrispondenza porta alle azioni seguenti:

    1. Le assegnazioni di s_k vengono calcolate ed estese r.
    2. I valori che rappresentano s_k nello stato di s_k vengono sostituiti con i valori di r estesi.
    3. Se s_k è definito come output=all, l'estensione r viene aggiunta all'output.
    4. Se s_k è il primo passaggio, inizia una nuova sequenza e l'ID corrispondenza aumenta di 1. Ciò influisce solo sull'output quando with_match_id viene usato.

Una volta completati i controlli per s_k , r si sposta su s_k-1.

Per un esempio dettagliato di questa logica, vedere la procedura dettagliata per la logica di analisi.

Esempio

Somma cumulativa

Calcolare la somma cumulativa per una colonna di input. Il risultato di questo esempio equivale all'uso di row_cumsum()..

range x from 1 to 5 step 1 
| scan declare (cumulative_x:long=0) with 
(
    step s1: true => cumulative_x = x + s1.cumulative_x;
)

Output

x cumulative_x
1 1
2 3
3 6
4 10
5 15

Somma cumulativa su più colonne con una condizione di reimpostazione

Calcolare la somma cumulativa per due colonne di input, reimpostare il valore della somma sul valore del record corrente ogni volta che la somma cumulativa ha raggiunto 10 o più.

range x from 1 to 5 step 1
| extend y = 2 * x
| scan declare (cumulative_x:long=0, cumulative_y:long=0) with 
(
    step s1: true => cumulative_x = iff(s1.cumulative_x >= 10, x, x + s1.cumulative_x), 
                     cumulative_y = iff(s1.cumulative_y >= 10, y, y + s1.cumulative_y);
)

Output

x y cumulative_x cumulative_y
1 2 1 2
2 4 3 6
3 6 6 12
4 8 10 8
5 10 5 18

Compilare una colonna

Compilare in avanti una colonna stringa. A ogni valore vuoto viene assegnato l'ultimo valore non vuoto visualizzato.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "",
    2m, "B",
    3m, "",
    4m, "",
    6m, "C",
    8m, "",
    11m, "D",
    12m, ""
]
;
Events
| sort by Ts asc
| scan declare (Event_filled: string="") with 
(
    step s1: true => Event_filled = iff(isempty(Event), s1.Event_filled, Event);
)

Output

Ts Evento Event_filled
00:00:00 Una Una
00:01:00 Una
00:02:00 B B
00:03:00 B
00:04:00 B
00:06:00 C C
00:08:00 C
00:11:00 D D
00:12:00 D

Assegnazione di tag alle sessioni

Dividere l'input in sessioni: una sessione termina 30 minuti dopo il primo evento della sessione, dopo la quale viene avviata una nuova sessione. Si noti l'uso del with_match_id flag, che assegna un valore univoco per ogni corrispondenza distinta (sessione) di analisi. Si noti anche l'uso speciale di due passaggi in questo esempio, ha true come condizione in inSession modo che acquisisca e restituisce tutti i record dall'input mentre endSession acquisisce i record che si verificano più di 30 m dal sessionStart valore per la corrispondenza corrente. Il endSession passaggio ha output=none un significato che non produce record di output. Il endSession passaggio viene usato per far avanzare lo stato della corrispondenza corrente da inSession a endSession, consentendo l'inizio di una nuova corrispondenza (sessione), a partire dal record corrente.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "A",
    2m, "B",
    3m, "D",
    32m, "B",
    36m, "C",
    38m, "D",
    41m, "E",
    75m, "A"
]
;
Events
| sort by Ts asc
| scan with_match_id=session_id declare (sessionStart: timespan) with 
(
    step inSession: true => sessionStart = iff(isnull(inSession.sessionStart), Ts, inSession.sessionStart);
    step endSession output=none: Ts - inSession.sessionStart > 30m;
)

Output

Ts Evento sessionStart session_id
00:00:00 Una 00:00:00 0
00:01:00 Una 00:00:00 0
00:02:00 B 00:00:00 0
00:03:00 D 00:00:00 0
00:32:00 B 00:32:00 1
00:36:00 C 00:32:00 1
00:38:00 D 00:32:00 1
00:41:00 E 00:32:00 1
01:15:00 Una 01:15:00 2

Eventi tra Start e Stop

Trovare tutte le sequenze di eventi tra l'evento Start e l'evento Stop che si verificano entro 5 minuti. Assegnare un ID corrispondenza per ogni sequenza.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Output

Ts Evento m_id
00:01:00 Avvio 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Stop 0
00:08:00 Avvio 1
00:11:00 E 1
00:12:00 Stop 1

Calcolare un imbuto personalizzato di eventi

Calcolare un completamento a imbuto della sequenza Hail ,Thunderstorm WindTornado>> con State soglie personalizzate sui tempi tra gli eventi (Tornado all'interno e Thunderstorm Wind all'interno 1h2hdi ). Questo esempio è simile al plug-in funnel_sequence_completion, ma consente una maggiore flessibilità.

StormEvents
| partition hint.strategy=native by State 
    (
    sort by StartTime asc
    | scan with 
    (
        step hail: EventType == "Hail";
        step tornado: EventType == "Tornado" and StartTime - hail.StartTime <= 1h;
        step thunderstormWind: EventType == "Thunderstorm Wind" and StartTime - tornado.StartTime <= 2h;
    )
    )
| summarize dcount(State) by EventType

Output

EventType dcount_State
Grandine 50
Tornado 34
Vento di tempesta 32

Procedura dettagliata per l'analisi della logica

Questa sezione illustra la logica di analisi usando una procedura dettagliata dell'esempio Eventi tra l'avvio e l'arresto :

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Stato

Si consideri lo stato dell'operatore scan come una tabella con una riga per ogni passaggio, in cui ogni passaggio ha il proprio stato. Questo stato contiene i valori più recenti delle colonne e le variabili dichiarate da tutti i passaggi precedenti e il passaggio corrente. Per altre informazioni, vedere State.To learn more, see State.

Per questo esempio, lo stato può essere rappresentato con la tabella seguente:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3

La "X" indica che un campo specifico è irrilevante per tale passaggio.

Logica di corrispondenza

Questa sezione segue la logica di corrispondenza tramite ogni record della Events tabella, illustrando la trasformazione dello stato e dell'output in ogni passaggio.

Nota

Un record di input viene valutato rispetto ai passaggi in ordine inverso, dall'ultimo passaggio (s3) al primo passaggio (s1).

Record 1

Ts Evento
0m "A"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché s3 manca una sequenza attiva.
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 è irrilevante perché non esiste alcun passaggio precedente. Il controllo 2 non viene passato perché il record non soddisfa la condizione di Event == "Start". Il record 1 viene eliminato senza influire sullo stato o sull'output.

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3

Record 2

Ts Evento
1m "Start"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché s3 manca una sequenza attiva.
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 è irrilevante perché non esiste alcun passaggio precedente. Il controllo 2 viene superato perché il record soddisfa la condizione di Event == "Start". Questa corrispondenza avvia una nuova sequenza e l'oggetto m_id viene assegnato. Il record 2 e il relativo m_id (0) vengono aggiunti allo stato e all'output.

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 0 00:01:00 "Start" X X X X
s2 X X
s3

Record 3

Ts Evento
2 m "B"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché s3 manca una sequenza attiva.
  • s2: viene passato il controllo 1 perché lo stato di s1 è nonempty e il record soddisfa la condizione di Ts - s1.Ts < 5m. Questa corrispondenza fa sì che lo stato di s1 venga cancellato e la sequenza in s1 venga alzata di livello a s2. Il record 3 e il relativo m_id (0) vengono aggiunti allo stato e all'output.
  • s1: il controllo 1 non è rilevante perché non esiste alcun passaggio precedente e il controllo 2 non viene passato perché il record non soddisfa la condizione di Event == "Start".

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 0 00:01:00 "Start" 00:02:00 "B" X X
s3

Record 4

Ts Evento
3 m "D"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché il record non soddisfa la condizione di Event == "Stop"e il controllo 2 non viene passato perché s3 manca una sequenza attiva.
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto. passa il controllo 2 perché soddisfa la condizione di Ts - s1.Ts < 5m. Il record 4 e il relativo m_id (0) vengono aggiunti allo stato e all'output. I valori di questo record sovrascrivono i valori di stato precedenti per s2.Ts e s2.Event.
  • s1: il controllo 1 non è rilevante perché non esiste alcun passaggio precedente e il controllo 2 non viene passato perché il record non soddisfa la condizione di Event == "Start".

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 0 00:01:00 "Start" 00:03:00 "D" X X
s3

Record 5

Ts Evento
4m "Stop"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 viene passato perché s2 non viene superato e soddisfa la s3 condizione di Event == "Stop". Questa corrispondenza causa la cancellazione dello stato s2 e la sequenza in s2 deve essere promossa a s3. Il record 5 e il relativo m_id (0) vengono aggiunti allo stato e all'output.
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 è irrilevante perché non è presente alcun passaggio precedente. Il controllo 2 non viene passato perché il record non soddisfa la condizione di Event == "Start".

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Record 6

Ts Evento
6m "C"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché s3 non soddisfa la s3 condizione di Event == "Stop".
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 non viene passato perché non è presente alcun passaggio precedente e il controllo 2 non viene passato perché non soddisfa la condizione di Event == "Start". Il record 6 viene rimosso senza influire sullo stato o sull'output.

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Record 7

Ts Evento
8m "Start"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché non soddisfa la condizione di Event == "Stop".
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 non viene passato perché non è presente alcun passaggio precedente. passa check 2 perché soddisfa la condizione di Event == "Start". Questa corrispondenza avvia una nuova sequenza in s1 con un nuovo m_idoggetto . Il record 7 e il relativo m_id (1) vengono aggiunti allo stato e all'output.

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 1 00:08:00 "Start" X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Nota

Nello stato sono ora presenti due sequenze attive.

Record 8

Ts Evento
11 m "E"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 non viene passato perché lo stato di s2 è vuoto e il controllo 2 non viene passato perché non soddisfa la s3 condizione di Event == "Stop".
  • s2: viene passato il controllo 1 perché lo stato di s1 è nonempty e il record soddisfa la condizione di Ts - s1.Ts < 5m. Questa corrispondenza fa sì che lo stato di s1 venga cancellato e la sequenza in s1 venga alzata di livello a s2. Il record 8 e il relativo m_id (1) vengono aggiunti allo stato e all'output.
  • s1: il controllo 1 non è rilevante perché non esiste alcun passaggio precedente e il controllo 2 non viene passato perché il record non soddisfa la condizione di Event == "Start".

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 1 00:08:00 "Start" 00:11:00 "E" X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Record 9

Ts Evento
12 m "Stop"

Registrare la valutazione in ogni passaggio:

  • s3: il controllo 1 viene superato perché s2 non èempty e soddisfa la s3 condizione di Event == "Stop". Questa corrispondenza fa sì che lo stato di s2 venga cancellato e la sequenza in s2 venga alzata di livello a s3. Il record 9 e il relativo m_id (1) vengono aggiunti allo stato e all'output.
  • s2: il controllo 1 non viene passato perché lo stato di s1 è vuoto e il controllo 2 non viene passato perché s2 manca una sequenza attiva.
  • s1: il controllo 1 non viene passato perché non è presente alcun passaggio precedente. passa il controllo 2 perché soddisfa la condizione di Event == "Start". Questa corrispondenza avvia una nuova sequenza in s1 con un nuovo m_idoggetto .

Stato:

step m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 1 00:08:00 "Start" 00:11:00 "E" 00:12:00 "Stop"

Output finale

Ts Evento m_id
00:01:00 Avvio 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Stop 0
00:08:00 Avvio 1
00:11:00 E 1
00:12:00 Stop 1