skanningsoperator
Gäller för: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Söker igenom data, matchar och bygger sekvenser baserat på predikaten.
Matchande poster bestäms enligt predikat som definieras i operatorns steg. Ett predikat kan bero på tillståndet som genereras av föregående steg. Utdata för matchande post bestäms av indataposten och tilldelningarna som definieras i operatorns steg.
Syntax
T| scan
[ with_match_id
=
MatchIdColumnName ] [ declare
(
ColumnDeclarations)
] with
(
StepDefinitions)
ColumnDeclarations syntax
ColumnName:
ColumnType[=
DefaultValue ] [,
... ]
StepDefinition syntax
step
StepName [ output
= all
| last
| none
] :
Condition [ =>
Column=
Assignment [,
... ] ] ] ;
Läs mer om syntaxkonventioner.
Parametrar
Namn | Typ | Krävs | Beskrivning |
---|---|---|---|
T | string |
✔️ | Tabellkällan för indata. |
MatchIdColumnName | string |
Namnet på en kolumn av typen long som läggs till i utdata som en del av genomsökningskörningen. Anger det 0-baserade indexet för matchningen för posten. |
|
ColumnDeclarations | string |
Deklarerar ett tillägg till schemat för T-. Dessa kolumner tilldelas värden i stegen. Om den inte tilldelas returneras DefaultValue-. Om inget annat anges är DefaultValuenull . |
|
StepName | string |
✔️ | Används för att referera till värden i genomsökningstillståndet för villkor och tilldelningar. Stegnamnet måste vara unikt. |
Villkor | string |
✔️ | Ett uttryck som utvärderas till true eller false som definierar vilka poster från indata som matchar steget. En post matchar steget när villkoret är true med stegets tillstånd eller med föregående stegs tillstånd. |
Tilldelning | string |
Ett skalärt uttryck som tilldelas motsvarande kolumn när en post matchar ett steg. | |
output |
string |
Styr utdatalogik för steget vid upprepade matchningar.
all matar ut alla poster som matchar steget, last endast matar ut den sista posten i en serie upprepade matchningar för steget, och none matar inte ut poster som matchar steget. Standardvärdet är all . |
Returnerar
En post för varje matchning av en post från indata till ett steg. Schemat för utdata är schemat för källan som utökas med kolumnen i declare
-satsen.
Genomsökningslogik
scan
går igenom serialiserade indata, registrerar efter post, jämför varje post med varje stegs villkor samtidigt som hänsyn tas till det aktuella tillståndet för varje steg.
Stat
Det underliggande tillståndet för scan
-operatorn kan betraktas som en tabell med en rad för varje step
. Varje steg upprätthåller sitt eget tillstånd med de senaste värdena för kolumnerna och deklarerade variabler från alla föregående steg och det aktuella steget. Om det är relevant innehåller det även matchnings-ID för den pågående sekvensen.
Om en genomsökningsoperator har n steg med namnet s_1, s_2, ..., s_n sedan steg s_k skulle ha k poster i dess tillstånd som motsvarar s_1, s_2, ..., s_k.
StepName.ColumnName- format används för att referera till ett värde i tillståndet. Till exempel skulle s_2.col1
referera till kolumn col1
som tillhör steg s_2 i tillståndet för s_k. Ett detaljerat exempel finns i genomgången genomsökningslogik.
Tillståndet börjar tomt och uppdateras när en skannad indatapost matchar ett steg. När tillståndet för det aktuella steget inte är snålt kallas steget för att ha en aktiv sekvens.
Matchande logik
Varje indatapost utvärderas mot alla steg i omvänd ordning, från det sista steget till det första. När en post r utvärderas mot något steg s_ktillämpas följande logik:
Kontrollera 1: Om tillståndet för föregående steg (s_k-1) inte är något och r uppfyller Villkor för s_kinträffar en matchning. Matchningen leder till följande åtgärder:
- Tillståndet för s_k är avmarkerat.
- Tillståndet för s_k-1 befordras till att bli tillståndet för s_k.
- Tilldelningarna av s_k beräknas och utökas r.
- Den utökade r läggs till i utdata och tillståndet för s_k.
Not
Om kontroll 1 resulterar i en matchning ignoreras kontroll 2 och r går vidare för att utvärderas mot s_k-1.
Kontroll 2: Om tillståndet för s_k har en aktiv sekvens eller s_k är det första steget, och r uppfyller Villkor för s_k, inträffar en matchning. Matchningen leder till följande åtgärder:
- Tilldelningarna av s_k beräknas och utökas r.
- Värdena som representerar s_k i tillståndet för s_k ersätts med värdena för den utökade r.
- Om s_k definieras som
output=all
läggs den utökade r till i utdata. - Om s_k är det första steget börjar en ny sekvens och matchnings-ID:t ökar med
1
. Detta påverkar bara utdata närwith_match_id
används.
När kontrollerna för s_k har slutförts går r vidare för att utvärderas mot s_k-1.
Ett detaljerat exempel på den här logiken finns i genomgången genomsökningslogik.
Exempel
Exemplet i det här avsnittet visar hur du använder syntaxen för att komma igång.
Exemplen i den här artikeln använder offentligt tillgängliga tabeller i hjälpkluster, till exempel tabellen
StormEvents
i databasen Samples.
Exemplen i den här artikeln använder offentligt tillgängliga tabeller, till exempel tabellen
StormEvents
i Väderanalys exempeldata.
Kumulativ summa
Beräkna den kumulativa summan för en indatakolumn. Resultatet av det här exemplet motsvarar att använda 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;
)
utdata
x | cumulative_x |
---|---|
1 | 1 |
2 | 3 |
3 | 6 |
4 | 10 |
5 | 15 |
Kumulativ summa för flera kolumner med ett återställningsvillkor
Beräkna den kumulativa summan för två indatakolumner, återställ summavärdet till det aktuella postvärdet när den kumulativa summan nådde 10 eller mer.
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);
)
utdata
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 |
Fyll framåt i en kolumn
Fyll framåt en strängkolumn. Varje tomt värde tilldelas det senast sedda icke-sedda värdet.
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);
)
utdata
Ts | Händelse | Event_filled |
---|---|---|
00:00:00 | A | A |
00:01:00 | A | |
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 |
Sessionstaggning
Dela upp indata i sessioner: en session slutar 30 minuter efter den första händelsen i sessionen, varefter en ny session startar. Observera användningen av flaggan with_match_id
, som tilldelar ett unikt värde för varje distinkt matchning (session) för genomsökning. Observera också den speciella användningen av två steg i det här exemplet, inSession
har true
som villkor så att den samlar in och matar ut alla poster från indata medan endSession
samlar in poster som inträffar mer än 30 m från sessionStart
-värdet för den aktuella matchningen. Det endSession
steget har output=none
vilket innebär att det inte producerar utdataposter. Det endSession
steget används för att öka statusen för den aktuella matchningen från inSession
till endSession
, så att en ny matchning (session) kan börja, med början från den aktuella posten.
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;
)
utdata
Ts | Händelse | sessionStart | session_id |
---|---|---|---|
00:00:00 | A | 00:00:00 | 0 |
00:01:00 | A | 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 | A | 01:15:00 | 2 |
Händelser mellan Start och Stopp
Hitta alla sekvenser av händelser mellan händelsen Start
och händelsen Stop
som inträffar inom 5 minuter. Tilldela ett matchnings-ID för varje sekvens.
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;
)
utdata
Ts | Händelse | m_id |
---|---|---|
00:01:00 | Starta | 0 |
00:02:00 | B | 0 |
00:03:00 | D | 0 |
00:04:00 | Stanna | 0 |
00:08:00 | Starta | 1 |
00:11:00 | E | 1 |
00:12:00 | Stanna | 1 |
Beräkna en anpassad tratt med händelser
Beräkna en trattavslutning av sekvensen Hail
–>Tornado
–>Thunderstorm Wind
efter State
med anpassade tröskelvärden för tiden mellan händelserna (Tornado
inom 1h
och Thunderstorm Wind
inom 2h
). Det här exemplet liknar det funnel_sequence_completion plugin-programmet, men ger större flexibilitet.
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
utdata
EventType | dcount_State |
---|---|
Hagel | 50 |
Tromb | 34 |
Åskväder | 32 |
Genomgång av logik
Det här avsnittet visar genomsökningslogik med hjälp av en stegvis genomgång av händelser mellan start och stopp exempel:
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;
)
utdata
Ts | Händelse | m_id |
---|---|---|
00:01:00 | Starta | 0 |
00:02:00 | B | 0 |
00:03:00 | D | 0 |
00:04:00 | Stanna | 0 |
00:08:00 | Starta | 1 |
00:11:00 | E | 1 |
00:12:00 | Stanna | 1 |
Tillståndet
Tänk på tillståndet för scan
-operatorn som en tabell med en rad för varje steg, där varje steg har sitt eget tillstånd. Det här tillståndet innehåller de senaste värdena för kolumnerna och deklarerade variabler från alla föregående steg och det aktuella steget. Mer information finns i State.
I det här exemplet kan tillståndet representeras med följande tabell:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 |
"X" anger att ett specifikt fält är irrelevant för det steget.
Matchningslogik
Det här avsnittet följer matchande logik genom varje post i tabellen Events
och förklarar omvandlingen av tillståndet och utdata i varje steg.
Not
En indatapost utvärderas mot stegen i omvänd ordning, från det sista steget (s3
) till det första steget (s1
).
Post 1
Ts | Händelse |
---|---|
0m | "A" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontroll 2 inte skickas eftersoms3
saknar en aktiv sekvens. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg. Kontroll 2 skickas inte eftersom posten inte uppfyller villkoret förEvent == "Start"
. Post 1 ignoreras utan att påverka tillståndet eller utdata.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 |
Post 2
Ts | Händelse |
---|---|
1 m | "Start" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontroll 2 inte skickas eftersoms3
saknar en aktiv sekvens. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg. Kontroll 2 skickas eftersom posten uppfyller villkoret förEvent == "Start"
. Den här matchningen initierar en ny sekvens ochm_id
tilldelas. Post 2 och dessm_id
(0
) läggs till i tillståndet och utdata.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | 0 | 00:01:00 | "Start" | X | X | X | X |
s2 | X | X | |||||
s3 |
Post 3
Ts | Händelse |
---|---|
2 m | "B" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontroll 2 inte skickas eftersoms3
saknar en aktiv sekvens. -
s2
: Kontrollera 1 skickas eftersom tillståndet förs1
inte är fel och posten uppfyller villkoret förTs - s1.Ts < 5m
. Den här matchningen gör att tillståndet förs1
rensas och sekvensen is1
befordras tills2
. Post 3 och dessm_id
(0
) läggs till i tillståndet och utdata. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg och Kontroll 2 inte skickas eftersom posten inte uppfyller villkoret förEvent == "Start"
.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | 0 | 00:01:00 | "Start" | 00:02:00 | "B" | X | X |
s3 |
Post 4
Ts | Händelse |
---|---|
3 m | "D" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom posten inte uppfyller villkoret förEvent == "Stop"
och Kontroll 2 inte skickas eftersoms3
saknar en aktiv sekvens. -
s2
: Kontrollera 1 skickas inte eftersom tillståndet förs1
är tomt. den skickar kontroll 2 eftersom den uppfyller villkoret förTs - s1.Ts < 5m
. Post 4 och dessm_id
(0
) läggs till i tillståndet och utdata. Värdena från den här posten skriver över de tidigare tillståndsvärdena förs2.Ts
ochs2.Event
. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg och Kontroll 2 inte skickas eftersom posten inte uppfyller villkoret förEvent == "Start"
.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | X | X |
s3 |
Post 5
Ts | Händelse |
---|---|
4 m | "Stopp" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas eftersoms2
inte ärs3
villkoret förEvent == "Stop"
. Den här matchningen gör att tillståndet förs2
rensas och sekvensen is2
befordras tills3
. Post 5 och dessm_id
(0
) läggs till i tillståndet och utdata. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg. Kontroll 2 skickas inte eftersom posten inte uppfyller villkoret förEvent == "Start"
.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Stopp" |
Post 6
Ts | Händelse |
---|---|
6 m | "C" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontrollera 2 inte skickas eftersoms3
inte uppfyllers3
villkoret förEvent == "Stop"
. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 skickas inte eftersom det inte finns något föregående steg och Kontrollera 2 inte skickas eftersom det inte uppfyller villkoret förEvent == "Start"
. Post 6 ignoreras utan att påverka tillståndet eller utdata.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Stopp" |
Post 7
Ts | Händelse |
---|---|
8 m | "Start" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontrollera 2 inte skickas eftersom det inte uppfyller villkoret förEvent == "Stop"
. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 skickas inte eftersom det inte finns något föregående steg. den skickar kontroll 2 eftersom den uppfyller villkoret förEvent == "Start"
. Den här matchning initierar en ny sekvens is1
med en nym_id
. Post 7 och dessm_id
(1
) läggs till i tillståndet och utdata.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
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 | "Stopp" |
Not
Det finns nu två aktiva sekvenser i tillståndet.
Post 8
Ts | Händelse |
---|---|
11 m | "E" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas inte eftersom tillståndet förs2
är tomt och Kontrollera 2 inte skickas eftersom det inte uppfyllers3
villkoret förEvent == "Stop"
. -
s2
: Kontrollera 1 skickas eftersom tillståndet förs1
inte är fel och posten uppfyller villkoret förTs - s1.Ts < 5m
. Den här matchningen gör att tillståndet förs1
rensas och sekvensen is1
befordras tills2
. Post 8 och dessm_id
(1
) läggs till i tillståndet och utdata. -
s1
: Kontrollera 1 är irrelevant eftersom det inte finns något föregående steg och Kontroll 2 inte skickas eftersom posten inte uppfyller villkoret förEvent == "Start"
.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
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 | "Stopp" |
Post 9
Ts | Händelse |
---|---|
12 m | "Stopp" |
Registrera utvärdering i varje steg:
-
s3
: Kontroll 1 skickas eftersoms2
inte ärs3
villkoret förEvent == "Stop"
. Den här matchningen gör att tillståndet förs2
rensas och sekvensen is2
befordras tills3
. Post 9 och dessm_id
(1
) läggs till i tillståndet och utdata. -
s2
: Kontroll 1 skickas inte eftersom tillståndet förs1
är tomt och Kontroll 2 inte skickas eftersoms2
saknar en aktiv sekvens. -
s1
: Kontrollera 1 skickas inte eftersom det inte finns något föregående steg. den skickar kontroll 2 eftersom den uppfyller villkoret förEvent == "Start"
. Den här matchning initierar en ny sekvens is1
med en nym_id
.
tillstånd:
steg | m_id | s1. Ts | s1. Händelse | s2. Ts | s2. Händelse | s3. Ts | s3. Händelse |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 1 | 00:08:00 | "Start" | 00:11:00 | "E" | 00:12:00 | "Stopp" |
Slutliga utdata
Ts | Händelse | m_id |
---|---|---|
00:01:00 | Starta | 0 |
00:02:00 | B | 0 |
00:03:00 | D | 0 |
00:04:00 | Stanna | 0 |
00:08:00 | Starta | 1 |
00:11:00 | E | 1 |
00:12:00 | Stanna | 1 |