Sdílet prostřednictvím


scan – operátor

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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

stepStepName [ outputallnone | | = 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ý stepoperá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:

    1. Stav s_k je vymazán.
    2. Stav s_k-1 se podporuje tak, aby se stal stavem s_k.
    3. Přiřazení s_k se počítají a rozšiřují r.
    4. 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:

    1. Přiřazení s_k se počítají a rozšiřují r.
    2. Hodnoty, které představují s_k ve stavu s_k , se nahradí hodnotami rozšířeného r.
    3. Pokud je s_k definován jako output=all, rozšířené r se přidá do výstupu.
    4. 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ři with_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 endSessionzá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 HailThunderstorm WindTornado>> s State vlastními prahovými hodnotami v časech mezi událostmi (Tornadouvnitř 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 stav s2 je prázdný a kontrola 2 není předána, protože s3 chybí aktivní sekvence.
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 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ínku Event == "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 stav s2 je prázdný a kontrola 2 není předána, protože s3 chybí aktivní sekvence.
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 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ínku Event == "Start". Tato shoda zahájí novou sekvenci a přiřadí se m_id . Záznam 2 a jeho m_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 stav s2 je prázdný a kontrola 2 není předána, protože s3 chybí aktivní sekvence.
  • s2: Kontrola 1 je předána, protože stav s1 je neprázdný a záznam splňuje podmínku Ts - s1.Ts < 5m. Tato shoda způsobí, že se stav s1 vymaže a pořadí s1 bude povýšeno na s2. Záznam 3 a jeho m_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ínku Event == "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ínku Event == "Stop", a kontrola 2 není předána, protože s3 chybí aktivní sekvence.
  • s2: Kontrola 1 se nepředá, protože stav s1 je prázdný. projde kontrolou 2 , protože splňuje podmínku Ts - s1.Ts < 5m. Záznam 4 a jeho m_id (0) se přidají do stavu a výstupu. Hodnoty z tohoto záznamu přepíší předchozí hodnoty stavu pro s2.Ts a s2.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ínku Event == "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že s2 je neprázdná a splňuje podmínku s3 Event == "Stop". Tato shoda způsobí, že se stav s2 vymaže a pořadí s2 bude povýšeno na s3. Záznam 5 a jeho m_id (0) se přidají do stavu a výstupu.
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 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ínku Event == "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 stav s2 je prázdný a kontrola 2 není předána, protože s3 nesplňuje podmínku s3 Event == "Stop".
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 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ínku Event == "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 stav s2 je prázdný a kontrola 2 není předána, protože nesplňuje podmínku Event == "Stop".
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 chybí aktivní sekvence.
  • s1: Kontrola 1 se nepředá, protože neexistuje žádný předchozí krok. projde kontrolou 2 , protože splňuje podmínku Event == "Start". Tato shoda iniciuje novou sekvenci s1 s novou m_id. Záznam 7 a jeho m_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 stav s2 je prázdný a kontrola 2 není předána, protože nesplňuje podmínku s3 Event == "Stop".
  • s2: Kontrola 1 je předána, protože stav s1 je neprázdný a záznam splňuje podmínku Ts - s1.Ts < 5m. Tato shoda způsobí, že se stav s1 vymaže a pořadí s1 bude povýšeno na s2. Záznam 8 a jeho m_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ínku Event == "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že s2 je neprázdná a splňuje podmínku s3 Event == "Stop". Tato shoda způsobí, že se stav s2 vymaže a pořadí s2 bude povýšeno na s3. Záznam 9 a jeho m_id (1) se přidají do stavu a výstupu.
  • s2: Kontrola 1 není předána, protože stav s1 je prázdný a kontrola 2 není předána, protože s2 chybí aktivní sekvence.
  • s1: Kontrola 1 se nepředá, protože neexistuje žádný předchozí krok. projde kontrolou 2 , protože splňuje podmínku Event == "Start". Tato shoda iniciuje novou sekvenci s1 s novou m_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