scan – operátor
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Kontroluje data, shody a vytváří sekvence na základě predikátů.
Odpovídající záznamy se určují podle predikátů definovaných v krocích operátora. Predikát může záviset na stavu, který je generován předchozími kroky. Výstup pro odpovídající záznam je určen vstupním záznamem a přiřazeními definovanými v krocích operátora.
Syntaxe
T | scan
[ with_match_id
=
MatchIdColumnName ] [ declare
(
ColumnDeclarations )
] with
(
StepDefinitions )
Syntaxe ColumnDeclarations
ColumnName :
ColumnType[=
DefaultValue ] [,
... ]
Syntaxe StepDefinition
step
StepName [ output
all
none
| | = last
] :
Podmínka [ =>
Přiřazení sloupce =
[,
... ] ];
Přečtěte si další informace o konvencích syntaxe.
Parametry
Název | Type | Požadováno | Popis |
---|---|---|---|
T | string |
✔️ | Vstupní tabulkový zdroj. |
MatchIdColumnName | string |
Název sloupce typu long , který je připojen k výstupu jako součást provádění kontroly. Označuje index založený na 0 shody záznamu. |
|
ColumnDeclarations | string |
Deklaruje rozšíření schématu T. Tyto sloupce jsou v krocích přiřazené hodnotami. Pokud není přiřazeno, vrátí se hodnota DefaultValue . Není-li zadáno jinak, hodnota DefaultValue je null . |
|
StepName | string |
✔️ | Slouží k odkazování na hodnoty ve stavu vyhledávání podmínek a přiřazení. Název kroku musí být jedinečný. |
Condition (Podmínka) | string |
✔️ | Výraz, který se vyhodnotí true jako nebo false který definuje, které záznamy ze vstupu odpovídají kroku. Záznam odpovídá kroku, pokud je true podmínka se stavem kroku nebo stavem předchozího kroku. |
Přiřazení | string |
Skalární výraz, který je přiřazen k odpovídajícímu sloupci, když záznam odpovídá kroku. | |
output |
string |
Řídí výstupní logiku kroku u opakovaných shod. all výstupy všech záznamů odpovídajících kroku, last výstupy pouze posledního záznamu v řadě opakujících se shod pro tento krok a none neprovádí výstup záznamů odpovídajících kroku. Výchozí hodnota je all . |
Návraty
Záznam pro každou shodu záznamu ze vstupu do kroku. Schéma výstupu je schéma zdroje rozšířeného se sloupcem v klauzuli declare
.
Logika skenování
scan
přejde přes serializovaná vstupní data, záznam podle záznamu, porovnává každý záznam s podmínkou každého kroku při zohlednění aktuálního stavu každého kroku.
State
Základní stav operátoru scan
lze považovat za tabulku s řádkem pro každý step
operátor . Každý krok udržuje svůj vlastní stav s nejnovějšími hodnotami sloupců a deklarovanými proměnnými ze všech předchozích kroků a aktuálního kroku. V případě potřeby také obsahuje ID shody pro probíhající sekvenci.
Pokud má operátor prohledávání n kroků pojmenovaných s_1, s_2, ..., s_n potom krok s_k by měl záznamy k ve svém stavu odpovídající s_1, s_2, ..., s_k. StepName.Formát ColumnName slouží k odkazu na hodnotu ve stavu. Například by odkazoval na sloupeccol1
, s_2.col1
který patří ke kroku s_2 ve stavu s_k. Podrobný příklad najdete v názorném postupu logiky kontroly.
Stav se spustí prázdný a aktualizuje se vždy, když naskenovaný vstupní záznam odpovídá kroku. Pokud je stav aktuálního kroku neprázdný, označuje se tento krok jako aktivní sekvence.
Odpovídající logika
Každý vstupní záznam se vyhodnotí vůči všem krokům v obráceném pořadí od posledního kroku k prvnímu. Když se vyhodnocuje r záznamu v určitém kroku s_k, použije se následující logika:
Kontrola 1: Pokud je stav předchozího kroku (s_k-1) neprázdný a r splňuje podmínku s_k, dojde ke shodě. Shoda vede k následujícím akcím:
- Stav s_k je vymazán.
- Stav s_k-1 se podporuje tak, aby se stal stavem s_k.
- Přiřazení s_k se počítají a rozšiřují r.
- Rozšířený r se přidá do výstupu a do stavu s_k.
Poznámka:
Pokud výsledkem kontroly 1 je shoda, je kontrola 2 ignorována a r se přesune, aby se vyhodnotil proti s_k-1.
Kontrola 2: Pokud má stav s_k aktivní sekvenci nebo s_k je první krok a r splňuje podmínku s_k, dojde ke shodě. Shoda vede k následujícím akcím:
- Přiřazení s_k se počítají a rozšiřují r.
- Hodnoty, které představují s_k ve stavu s_k , se nahradí hodnotami rozšířeného r.
- Pokud je s_k definován jako
output=all
, rozšířené r se přidá do výstupu. - Pokud je s_k prvním krokem, zahájí se nová sekvence a ID shody se zvýší o
1
. To má vliv jenom na výstup přiwith_match_id
použití.
Po dokončení kontrol s_k se r přesune k vyhodnocení s_k-1.
Podrobný příklad této logiky najdete v názorném průvodci logikou kontroly.
Příklady
Kumulativní součet
Vypočítá kumulativní součet vstupního sloupce. Výsledek tohoto příkladu odpovídá použití 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;
)
Výstup
linka | cumulative_x |
---|---|
1 | 0 |
2 | 3 |
3 | 6 |
4 | 10 |
5 | 15 |
Kumulativní součet ve více sloupcích s podmínkou resetování
Spočítejte kumulativní součet pro dva vstupní sloupce, obnovte hodnotu součtu na aktuální hodnotu záznamu, kdykoli kumulativní součet dosáhl hodnoty 10 nebo více.
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);
)
Výstup
linka | 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 |
Vyplnění sloupce vpřed
Vyplňte sloupec řetězce dopředu. Každé prázdné hodnotě je přiřazena poslední zobrazená neprázdná hodnota.
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);
)
Výstup
Ts | Událost | Event_filled |
---|---|---|
00:00:00 | A | A |
00:01:00 | A | |
00:02:00 | T | T |
00:03:00 | T | |
00:04:00 | T | |
00:06:00 | C | C |
00:08:00 | C | |
00:11:00 | D | D |
00:12:00 | D |
Označování relací
Rozdělte vstup do relací: Relace končí 30 minut po první události relace, po které se spustí nová relace. Všimněte si použití příznaku with_match_id
, který přiřadí jedinečnou hodnotu pro každou jedinečnou shodu (relaci) kontroly. Všimněte si také, že speciální použití dvou kroků v tomto příkladu má true
jako podmínku, aby zachytil a vypíše všechny záznamy ze vstupu, inSession
zatímco endSession
zaznamenává záznamy, ke kterým dochází více než 30 m z sessionStart
hodnoty aktuální shody. Tento endSession
krok znamená output=none
, že nevytáčí výstupní záznamy. Tento endSession
krok slouží k posunu stavu aktuální shody od inSession
aktuálního endSession
záznamu, což umožňuje zahájení nové shody (relace) od aktuálního záznamu.
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;
)
Výstup
Ts | Událost | sessionStart | session_id |
---|---|---|---|
00:00:00 | A | 00:00:00 | 0 |
00:01:00 | A | 00:00:00 | 0 |
00:02:00 | T | 00:00:00 | 0 |
00:03:00 | D | 00:00:00 | 0 |
00:32:00 | T | 00:32:00 | 0 |
00:36:00 | C | 00:32:00 | 0 |
00:38:00 | D | 00:32:00 | 0 |
00:41:00 | E | 00:32:00 | 0 |
01:15:00 | A | 01:15:00 | 2 |
Události mezi spuštěním a zastavením
Najděte všechny posloupnosti událostí mezi událostí Start
a událostí Stop
, ke kterým dochází během 5 minut. Přiřaďte ID shody pro každou sekvenci.
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;
)
Výstup
Ts | Událost | m_id |
---|---|---|
00:01:00 | Spustit | 0 |
00:02:00 | T | 0 |
00:03:00 | D | 0 |
00:04:00 | Zastavit | 0 |
00:08:00 | Spustit | 0 |
00:11:00 | E | 0 |
00:12:00 | Zastavit | 0 |
Výpočet vlastního trychtýře událostí
Výpočet dokončení trychtýře sekvence Hail
–Thunderstorm Wind
Tornado
>> s State
vlastními prahovými hodnotami v časech mezi událostmi (Tornado
uvnitř 1h
a Thunderstorm Wind
uvnitř).2h
Tento příklad je podobný modulu plug-in funnel_sequence_completion, ale umožňuje větší flexibilitu.
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
Výstup
Typ události | dcount_State |
---|---|
Krupobití | 50 |
Tornádo | 34 |
Větrná bouře | 32 |
Průvodce logikou prohledávání
Tato část ukazuje logiku kontroly pomocí podrobného návodu k událostem mezi spuštěním a příkladem zastavení:
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;
)
Stav
Stav operátoru scan
si můžete představit jako tabulku s řádkem pro každý krok, ve kterém má každý krok svůj vlastní stav. Tento stav obsahuje nejnovější hodnoty sloupců a deklarovaných proměnných ze všech předchozích kroků a aktuálního kroku. Další informace najdete v tématu Stav.
V tomto příkladu může být stav reprezentován následující tabulkou:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 |
Symbol "X" označuje, že pro daný krok není relevantní konkrétní pole.
Odpovídající logika
Tato část se řídí odpovídající logikou při každém záznamu Events
tabulky a vysvětluje transformaci stavu a výstupu v jednotlivých krocích.
Poznámka:
Vstupní záznam se vyhodnocuje podle kroků v obráceném pořadí od posledního kroku (s3
) po první krok (s1
).
Záznam 1
Ts | Událost |
---|---|
0 min. | "A" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protožes3
chybí aktivní sekvence.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok. Kontrola 2 není předána, protože záznam nesplňuje podmínkuEvent == "Start"
. Záznam 1 se zahodí, aniž by to ovlivnilo stav nebo výstup.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 |
Záznam 2
Ts | Událost |
---|---|
1 mil. | "Start" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protožes3
chybí aktivní sekvence.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok. Kontrola 2 je předána, protože záznam splňuje podmínkuEvent == "Start"
. Tato shoda zahájí novou sekvenci a přiřadí sem_id
. Záznam 2 a jehom_id
(0
) se přidají do stavu a výstupu.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | 0 | 00:01:00 | "Start" | X | X | X | X |
s2 | X | X | |||||
s3 |
Záznam 3
Ts | Událost |
---|---|
2 min. | "B" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protožes3
chybí aktivní sekvence.s2
: Kontrola 1 je předána, protože stavs1
je neprázdný a záznam splňuje podmínkuTs - s1.Ts < 5m
. Tato shoda způsobí, že se stavs1
vymaže a pořadís1
bude povýšeno nas2
. Záznam 3 a jehom_id
(0
) se přidají do stavu a výstupu.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok a kontrola 2 není předána, protože záznam nesplňuje podmínkuEvent == "Start"
.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | 0 | 00:01:00 | "Start" | 00:02:00 | "B" | X | X |
s3 |
Záznam 4
Ts | Událost |
---|---|
3 m | "D" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože záznam nesplňuje podmínkuEvent == "Stop"
, a kontrola 2 není předána, protožes3
chybí aktivní sekvence.s2
: Kontrola 1 se nepředá, protože stavs1
je prázdný. projde kontrolou 2 , protože splňuje podmínkuTs - s1.Ts < 5m
. Záznam 4 a jehom_id
(0
) se přidají do stavu a výstupu. Hodnoty z tohoto záznamu přepíší předchozí hodnoty stavu pros2.Ts
as2.Event
.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok a kontrola 2 není předána, protože záznam nesplňuje podmínkuEvent == "Start"
.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | X | X |
s3 |
Záznam 5
Ts | Událost |
---|---|
4 min. | "Zastavit" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 je předána, protožes2
je neprázdná a splňuje podmínkus3
Event == "Stop"
. Tato shoda způsobí, že se stavs2
vymaže a pořadís2
bude povýšeno nas3
. Záznam 5 a jehom_id
(0
) se přidají do stavu a výstupu.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok. Kontrola 2 není předána, protože záznam nesplňuje podmínkuEvent == "Start"
.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Zastavit" |
Záznam 6
Ts | Událost |
---|---|
6 min. | "C" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protožes3
nesplňuje podmínkus3
Event == "Stop"
.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 není předána, protože neexistuje žádný předchozí krok a kontrola 2 není předána, protože nesplňuje podmínkuEvent == "Start"
. Záznam 6 se zahodí, aniž by to ovlivnilo stav nebo výstup.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Zastavit" |
Záznam 7
Ts | Událost |
---|---|
8 min. | "Start" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protože nesplňuje podmínkuEvent == "Stop"
.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 se nepředá, protože neexistuje žádný předchozí krok. projde kontrolou 2 , protože splňuje podmínkuEvent == "Start"
. Tato shoda iniciuje novou sekvencis1
s novoum_id
. Záznam 7 a jehom_id
(1
) se přidají do stavu a výstupu.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | 0 | 00:08:00 | "Start" | X | X | X | X |
s2 | X | X | |||||
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Zastavit" |
Poznámka:
Ve stavu jsou teď dvě aktivní sekvence.
Záznam 8
Ts | Událost |
---|---|
11 min. | "E" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 není předána, protože stavs2
je prázdný a kontrola 2 není předána, protože nesplňuje podmínkus3
Event == "Stop"
.s2
: Kontrola 1 je předána, protože stavs1
je neprázdný a záznam splňuje podmínkuTs - s1.Ts < 5m
. Tato shoda způsobí, že se stavs1
vymaže a pořadís1
bude povýšeno nas2
. Záznam 8 a jehom_id
(1
) se přidají do stavu a výstupu.s1
: Kontrola 1 není relevantní, protože neexistuje žádný předchozí krok a kontrola 2 není předána, protože záznam nesplňuje podmínkuEvent == "Start"
.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | 0 | 00:08:00 | "Start" | 00:11:00 | "E" | X | X |
s3 | 0 | 00:01:00 | "Start" | 00:03:00 | "D" | 00:04:00 | "Zastavit" |
Záznam 9
Ts | Událost |
---|---|
12 min. | "Zastavit" |
Zaznamenat vyhodnocení v každém kroku:
s3
: Kontrola 1 je předána, protožes2
je neprázdná a splňuje podmínkus3
Event == "Stop"
. Tato shoda způsobí, že se stavs2
vymaže a pořadís2
bude povýšeno nas3
. Záznam 9 a jehom_id
(1
) se přidají do stavu a výstupu.s2
: Kontrola 1 není předána, protože stavs1
je prázdný a kontrola 2 není předána, protožes2
chybí aktivní sekvence.s1
: Kontrola 1 se nepředá, protože neexistuje žádný předchozí krok. projde kontrolou 2 , protože splňuje podmínkuEvent == "Start"
. Tato shoda iniciuje novou sekvencis1
s novoum_id
.
Stát:
step | m_id | s1. Ts | s1. Událost | s2. Ts | s2. Událost | s3. Ts | s3. Událost |
---|---|---|---|---|---|---|---|
s1 | X | X | X | X | |||
s2 | X | X | |||||
s3 | 0 | 00:08:00 | "Start" | 00:11:00 | "E" | 00:12:00 | "Zastavit" |
Konečný výstup
Ts | Událost | m_id |
---|---|---|
00:01:00 | Spustit | 0 |
00:02:00 | T | 0 |
00:03:00 | D | 0 |
00:04:00 | Zastavit | 0 |
00:08:00 | Spustit | 0 |
00:11:00 | E | 0 |
00:12:00 | Zastavit | 0 |