Sdílet prostřednictvím


skenovací operátor

Přepněte služby pomocí rozevíracího seznamu Verze . Přečtěte si další informace o navigaci.
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.

Syntax

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

Syntaxe ColumnDeclarations

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

Syntaxe StepDefinition

step StepName [ output = all | last | none] : Podmínka [ =>sloupce= [, ... ] ];

Přečtěte si další informace o konvencích syntaxe.

Parameters

Name Typ Required Description
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 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.
Assignment 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.

Returns

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 kontroly 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 sloupecs_2.col1, 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. Při vyhodnocení záznamu r v určitém kroku s_k se použije následující logika:

  • Kontrola 1: Pokud je stav předchozího kroku (s_k-1) neprázdný a r splňuje podmínkus_k, dojde ke shodě. Shoda vede k následujícím akcím:

    1. Stav s_k se vymaže.
    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.

    Note

    Pokud výsledkem kontroly 1 je shoda, bude kontrola 2 ignorována a r se bude vyhodnocovat proti s_k-1.

  • Kontrola 2: Pokud má stav s_k aktivní sekvenci nebo s_k je prvním krokem a r splňuje podmínkus_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_kse r přesune k vyhodnocení s_k-1.

Podrobný příklad této logiky najdete v názorném průvodci logikou kontroly.

Examples

Příklad v této části ukazuje, jak použít syntaxi, která vám pomůže začít.

Příklady v tomto článku používají veřejně dostupné tabulky v clusteru nápovědy, jako je StormEvents tabulka v databázi Ukázky.

Příklady v tomto článku používají veřejně dostupné tabulky, například Weather tabulku v galerii ukázek analýzy počasí. Možná budete muset změnit název tabulky v ukázkovém dotazu tak, aby odpovídal tabulce v pracovním prostoru.

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;
)

Output

x cumulative_x
1 1
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);
)

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

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);
)

Output

Ts Event 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

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á inSession jako podmínku, aby zachytil a vypíše všechny záznamy ze vstupu, true 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;
)

Output

Ts Event 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

Výpočet délky relace na uživatele

Pomocí operátoru scan vypočítejte počáteční čas relace, koncový čas a dobu trvání relace každého uživatele. Relace se definuje jako období mezi přihlášením uživatele a následným odhlášením. Díky kombinování partition a scan s output=none a output=all, tento vzor zajišťuje, že jeden řádek se vrátí na relaci (tj. na dvojici přihlášení/odhlášení) místo řádku na událost.

Logika funguje podle:

  • V kroku s1: Zachycení časového razítka přihlášení pomocí kroku kontroly s output=none
  • V kroku s2: Generování řádku pouze v případech, kdy se najde odpovídající odhlášení pomocí output=all
let LogsEvents = datatable(Timestamp:datetime, userID:int, EventType:string)
[
    datetime(2024-05-28 08:15:23), 1, "login",
    datetime(2024-05-28 08:30:15), 2, "login",
    datetime(2024-05-28 09:10:27), 3, "login",
    datetime(2024-05-28 12:30:45), 1, "logout",
    datetime(2024-05-28 11:45:32), 2, "logout",
    datetime(2024-05-28 13:25:19), 3, "logout"
];
LogsEvents
| sort by userID, Timestamp
| partition hint.strategy=native by userID (
    sort by Timestamp asc 
    | scan declare (start: datetime, end: datetime, sessionDuration: timespan) with (
        step s1 output=none: EventType == "login" => start = Timestamp;
        step s2 output=all: EventType == "logout" => start = s1.start, end = Timestamp, sessionDuration = Timestamp - s1.start;
    )
)
| project start, end, userID, sessionDuration

Output

userID start end sessionDuration
1 2024-05-28 08:15:23.0000 2024-05-28 12:30:45.0000 04:15:22
3 2024-05-28 09:10:27.0000 2024-05-28 13:25:19.0000 04:14:52
2 2024-05-28 08:30:15.0000 2024-05-28 11:45:32.0000 03:15:17

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;
)

Output

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

Výpočet vlastního trychtýře událostí

Výpočet dokončení trychtýře sekvence Hail –>Tornado>Thunderstorm Wind 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

Output

EventType dcount_State
Hail 50
Tornado 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;
)

Output

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

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:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
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.

Note

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 Event
0m "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.

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
s1 X X X X
s2 X X
s3

Záznam 2

Ts Event
1m "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.

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
s1 0 00:01:00 "Start" X X X X
s2 X X
s3

Záznam 3

Ts Event
2m "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".

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
s1 X X X X
s2 0 00:01:00 "Start" 00:02:00 "B" X X
s3

Záznam 4

Ts Event
3m "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".

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
s1 X X X X
s2 0 00:01:00 "Start" 00:03:00 "D" X X
s3

Záznam 5

Ts Event
4m "Stop"

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 s3Event == "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".

State:

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

Záznam 6

Ts Event
6m "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 s3Event == "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.

State:

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

Záznam 7

Ts Event
8m "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.

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
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"

Note

Ve stavu jsou teď dvě aktivní sekvence.

Záznam 8

Ts Event
11m "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 s3Event == "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".

State:

krokovat m_id s1.Ts s1.Event s2.Ts s2.Event s3.Ts s3.Event
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"

Záznam 9

Ts Event
12m "Stop"

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 s3Event == "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 není předána, protože neexistuje žádný předchozí krok a kontrola 2 se nepředá, protože záznam nesplňuje podmínku Event == "Start".

State:

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

Konečný výstup

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