scanoperator

Scant gegevens, overeenkomsten en bouwt reeksen op basis van de predicaten.

Overeenkomende records worden bepaald op basis van predicaten die zijn gedefinieerd in de stappen van de operator. Een predicaat kan afhankelijk zijn van de status die door de vorige stappen wordt gegenereerd. De uitvoer voor de overeenkomende record wordt bepaald door de invoerrecord en toewijzingen die zijn gedefinieerd in de stappen van de operator.

Syntax

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

Syntaxis van ColumnDeclarations

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

StepDefinition-syntaxis

stepStepName [ output | last = all | none] :Condition [ =>Kolomtoewijzing= [, ... ] ];

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
T string ✔️ De invoerbron in tabelvorm.
MatchIdColumnName string De naam van een kolom van het type long die aan de uitvoer wordt toegevoegd als onderdeel van de scanuitvoering. Geeft de index op basis van 0 aan van de overeenkomst voor de record.
ColumnDeclarations string Declareert een extensie voor het schema van T. Deze kolommen zijn toegewezen waarden in de stappen. Als deze niet is toegewezen, wordt de DefaultValue geretourneerd. Tenzij anders opgegeven, is nullDefaultValue .
StepName string ✔️ Wordt gebruikt om te verwijzen naar waarden in de status van het scannen op voorwaarden en toewijzingen. De naam van de stap moet uniek zijn.
Condition string ✔️ Een expressie die evalueert naar true of false die definieert welke records uit de invoer overeenkomen met de stap. Een record komt overeen met de stap wanneer de voorwaarde true de status van de stap of de status van de vorige stap heeft.
Toewijzing string Een scalaire expressie die wordt toegewezen aan de bijbehorende kolom wanneer een record overeenkomt met een stap.
output string Hiermee bepaalt u de uitvoerlogica van de stap voor herhaalde overeenkomsten. all voert alle records uit die overeenkomen met de stap, last alleen de laatste record in een reeks herhalende overeenkomsten voor de stap en none voert geen records uit die overeenkomen met de stap. De standaardwaarde is all.

Retouren

Een record voor elke overeenkomst van een record, van de invoer tot een stap. Het schema van de uitvoer is het schema van de bron, uitgebreid met de kolom in de declare -component.

Scanlogica

scan doorloopt de geserialiseerde invoergegevens, record voor record, waarbij elke record wordt vergeleken met de voorwaarde van elke stap, waarbij rekening wordt gehouden met de huidige status van elke stap.

Staat

De onderliggende status van de scan operator kan worden beschouwd als een tabel met een rij voor elke step. Elke stap behoudt zijn eigen status met de meest recente waarden van de kolommen en gedeclareerde variabelen uit alle vorige stappen en de huidige stap. Indien relevant, bevat het ook de overeenkomst-id voor de lopende volgorde.

Als een scanoperator n stappen heeft met de namen s_1, s_2, ... , s_n , heeft stap s_kk-records in de status die overeenkomt met s_1, s_2, ... , s_k. De StepName. De indeling ColumnName wordt gebruikt om te verwijzen naar een waarde in de status. verwijst bijvoorbeeld s_2.col1 naar de kolom col1 die behoort tot stap s_2 in de status van s_k. Zie het overzicht van de scanlogica voor een gedetailleerd voorbeeld.

De status begint leeg en wordt bijgewerkt wanneer een gescande invoerrecord overeenkomt met een stap. Wanneer de status van de huidige stap niet geldig is, wordt de stap aangeduid als een actieve reeks.

Overeenkomende logica

Elke invoerrecord wordt geëvalueerd op basis van alle stappen in omgekeerde volgorde, van de laatste stap tot de eerste. Wanneer een record r wordt geëvalueerd op basis van een stap s_k, wordt de volgende logica toegepast:

  • Controle 1: Als de status van de vorige stap (s_k-1) geen waarde heeft en r voldoet aan de voorwaardevan s_k, treedt er een overeenkomst op. De overeenkomst leidt tot de volgende acties:

    1. De status van s_k is gewist.
    2. De staat van s_k-1 wordt gepromoveerd tot de staat van s_k.
    3. De toewijzingen van s_k worden berekend en uitbreiden r.
    4. De uitgebreide r wordt toegevoegd aan de uitvoer en aan de status van s_k.

    Notitie

    Als controle 1 resulteert in een overeenkomst, wordt controle 2 genegeerd en wordt r geëvalueerd op basis van s_k-1.

  • Controle 2: Als de status van s_k een actieve volgorde heeft of s_k de eerste stap is en r voldoet aan de voorwaardevan s_k, treedt er een overeenkomst op. De overeenkomst leidt tot de volgende acties:

    1. De toewijzingen van s_k worden berekend en uitbreiden r.
    2. De waarden die s_k in de status van s_k vertegenwoordigen, worden vervangen door de waarden van de uitgebreide r.
    3. Als s_k is gedefinieerd als output=all, wordt de uitgebreide r toegevoegd aan de uitvoer.
    4. Als s_k de eerste stap is, wordt er een nieuwe reeks gestart en wordt de overeenkomst-id met verhoogd 1. Dit is alleen van invloed op de uitvoer wanneer with_match_id wordt gebruikt.

Zodra de controles voor s_k zijn voltooid, wordt r geëvalueerd op basis van s_k-1.

Zie het overzicht van scanlogica voor een gedetailleerd voorbeeld van deze logica.

Voorbeelden

Cumulatief totaal

De cumulatieve som voor een invoerkolom berekenen. Het resultaat van dit voorbeeld is gelijk aan het gebruik van 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;
)

Uitvoer

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

Cumulatieve som voor meerdere kolommen met een voorwaarde voor opnieuw instellen

Bereken de cumulatieve som voor twee invoerkolommen en stel de somwaarde opnieuw in op de huidige recordwaarde wanneer de cumulatieve som 10 of meer heeft bereikt.

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

Uitvoer

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

Een kolom vooruit invullen

Een tekenreekskolom vooruit vullen. Aan elke lege waarde wordt de laatst geziene waarde toegewezen.

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

Uitvoer

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

Sessies taggen

Verdeel de invoer in sessies: een sessie eindigt 30 minuten na de eerste gebeurtenis van de sessie, waarna een nieuwe sessie wordt gestart. Let op het gebruik van with_match_id vlag, waarmee een unieke waarde wordt toegewezen voor elke afzonderlijke overeenkomst (sessie) van de scan. Let ook op het speciale gebruik van twee stappen in dit voorbeeld, inSession heeft true als voorwaarde, zodat alle records van de invoer worden vastgelegd en uitgevoerd, terwijl endSession records worden vastgelegd die meer dan 30 meter van de sessionStart waarde voor de huidige overeenkomst plaatsvinden. De endSession stap betekent output=none dat er geen uitvoerrecords worden geproduceerd. De endSession stap wordt gebruikt om de status van de huidige overeenkomst van inSession naar te endSessiongaan, zodat een nieuwe overeenkomst (sessie) kan beginnen vanaf de huidige record.

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

Uitvoer

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

Gebeurtenissen tussen starten en stoppen

Alle reeksen gebeurtenissen zoeken tussen de gebeurtenis Start en de gebeurtenis Stop die zich binnen 5 minuten voordoen. Wijs een overeenkomst-id toe voor elke reeks.

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

Uitvoer

Ts Gebeurtenis m_id
00:01:00 Starten 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Stoppen 0
00:08:00 Starten 1
00:11:00 E 1
00:12:00 Stoppen 1

Een aangepaste trechter met gebeurtenissen berekenen

Bereken een trechtervoltooiing van de reeks Hail ->>StateTornadoThunderstorm Wind met aangepaste drempelwaarden voor de tijden tussen de gebeurtenissen (Tornadobinnen 1h en Thunderstorm Wind binnen ).2h Dit voorbeeld is vergelijkbaar met de funnel_sequence_completion-invoegtoepassing, maar biedt meer flexibiliteit.

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

Uitvoer

EventType dcount_State
Hagel 50
Tornado 34
Onweerswind 32

Overzicht van scanlogica

In deze sectie wordt de scanlogica gedemonstreerd aan de hand van een stapsgewijs overzicht van het voorbeeld Gebeurtenissen tussen begin en einde :

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

De status

U kunt de status van de scan operator zien als een tabel met een rij voor elke stap, waarin elke stap een eigen status heeft. Deze status bevat de meest recente waarden van de kolommen en gedeclareerde variabelen uit alle vorige stappen en de huidige stap. Zie Status voor meer informatie.

In dit voorbeeld kan de status worden weergegeven met de volgende tabel:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 X X
s3

De 'X' geeft aan dat een specifiek veld niet relevant is voor die stap.

De overeenkomende logica

Deze sectie volgt de overeenkomende logica voor elke record van de Events tabel, waarin de transformatie van de status en uitvoer bij elke stap wordt uitgelegd.

Notitie

Een invoerrecord wordt geëvalueerd op basis van de stappen in omgekeerde volgorde, van de laatste stap (s3) tot de eerste stap (s1).

Record 1

Ts Gebeurtenis
0m "A"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 wordt niet doorgegeven omdat s3 er geen actieve volgorde is.
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is. Controle 2 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Start". Record 1 wordt verwijderd zonder dat dit van invloed is op de status of uitvoer.

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 X X
s3

Record 2

Ts Gebeurtenis
1m "Starten"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 wordt niet doorgegeven omdat s3 er geen actieve volgorde is.
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is. Controle 2 wordt doorgegeven omdat de record voldoet aan de voorwaarde van Event == "Start". Deze overeenkomst initieert een nieuwe reeks en de m_id wordt toegewezen. Record 2 en de bijbehorende m_id (0) worden toegevoegd aan de status en de uitvoer.

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 0 00:01:00 "Starten" X X X X
s2 X X
s3

Record 3

Ts Gebeurtenis
2m "B"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 wordt niet doorgegeven omdat s3 er geen actieve volgorde is.
  • s2: controle 1 wordt doorgegeven omdat de status van s1 niet-mpty is en de record voldoet aan de voorwaarde van Ts - s1.Ts < 5m. Deze overeenkomst zorgt ervoor dat de status van s1 wordt gewist en de volgorde in s1 wordt gepromoveerd naar s2. Record 3 en de bijbehorende m_id (0) worden toegevoegd aan de status en de uitvoer.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is en controle 2 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Start".

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 0 00:01:00 "Starten" 00:02:00 "B" X X
s3

Record 4

Ts Gebeurtenis
3m "D"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Stop", en controle 2 wordt niet doorgegeven omdat s3 er geen actieve volgorde is.
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is. het voldoet aan controle 2 omdat het voldoet aan de voorwaarde van Ts - s1.Ts < 5m. Record 4 en de bijbehorende m_id (0) worden toegevoegd aan de status en de uitvoer. De waarden uit deze record overschrijven de vorige statuswaarden voor s2.Ts en s2.Event.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is en controle 2 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Start".

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 0 00:01:00 "Starten" 00:03:00 "D" X X
s3

Record 5

Ts Gebeurtenis
4m "Stop"

Noteer de evaluatie bij elke stap:

  • s3: Controle 1 wordt doorgegeven omdat s2 niet-mpty is en voldoet aan de s3 voorwaarde van Event == "Stop". Deze overeenkomst zorgt ervoor dat de status van s2 wordt gewist en de volgorde in s2 wordt gepromoveerd naar s3. Record 5 en de bijbehorende m_id (0) worden toegevoegd aan de status en de uitvoer.
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is. Controle 2 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Start".

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 X X
s3 0 00:01:00 "Starten" 00:03:00 "D" 00:04:00 "Stop"

Record 6

Ts Gebeurtenis
6m "C"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 niet wordt doorgegeven omdat s3 niet voldoet aan de s3 voorwaarde van Event == "Stop".
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet geslaagd omdat er geen vorige stap is en controle 2 wordt niet doorgegeven omdat deze niet voldoet aan de voorwaarde van Event == "Start". Record 6 wordt verwijderd zonder dat dit van invloed is op de status of uitvoer.

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 X X
s3 0 00:01:00 "Starten" 00:03:00 "D" 00:04:00 "Stop"

Record 7

Ts Gebeurtenis
8m "Starten"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 niet wordt doorgegeven omdat deze niet voldoet aan de voorwaarde van Event == "Stop".
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet geslaagd omdat er geen vorige stap is. het voldoet aan controle 2 omdat het voldoet aan de voorwaarde van Event == "Start". Met deze overeenkomst wordt een nieuwe reeks gestart in s1 met een nieuwe m_id. Record 7 en de bijbehorende m_id (1) worden toegevoegd aan de status en de uitvoer.

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 1 00:08:00 "Starten" X X X X
s2 X X
s3 0 00:01:00 "Starten" 00:03:00 "D" 00:04:00 "Stop"

Notitie

Er zijn nu twee actieve reeksen in de status.

Record 8

Ts Gebeurtenis
11m "E"

Noteer de evaluatie bij elke stap:

  • s3: controle 1 wordt niet doorgegeven omdat de status van s2 leeg is en controle 2 niet wordt doorgegeven omdat deze niet voldoet aan de s3 voorwaarde van Event == "Stop".
  • s2: controle 1 wordt doorgegeven omdat de status van s1 niet-mpty is en de record voldoet aan de voorwaarde van Ts - s1.Ts < 5m. Deze overeenkomst zorgt ervoor dat de status van s1 wordt gewist en de volgorde in s1 wordt gepromoveerd naar s2. Record 8 en de bijbehorende m_id (1) worden toegevoegd aan de status en de uitvoer.
  • s1: controle 1 is niet relevant omdat er geen vorige stap is en controle 2 wordt niet doorgegeven omdat de record niet voldoet aan de voorwaarde van Event == "Start".

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 1 00:08:00 "Starten" 00:11:00 "E" X X
s3 0 00:01:00 "Starten" 00:03:00 "D" 00:04:00 "Stop"

Record 9

Ts Gebeurtenis
12m "Stop"

Noteer de evaluatie bij elke stap:

  • s3: Controle 1 wordt doorgegeven omdat s2 niet-mpty is en voldoet aan de s3 voorwaarde van Event == "Stop". Deze overeenkomst zorgt ervoor dat de status van s2 wordt gewist en de volgorde in s2 wordt gepromoveerd naar s3. Record 9 en de bijbehorende m_id (1) worden toegevoegd aan de status en de uitvoer.
  • s2: controle 1 wordt niet doorgegeven omdat de status van s1 leeg is en controle 2 wordt niet doorgegeven omdat s2 er geen actieve volgorde is.
  • s1: controle 1 is niet geslaagd omdat er geen vorige stap is. het voldoet aan controle 2 omdat het voldoet aan de voorwaarde van Event == "Start". Met deze overeenkomst wordt een nieuwe reeks gestart in s1 met een nieuwe m_id.

Staat:

stap m_id s1. Ts s1. Gebeurtenis s2. Ts s2. Gebeurtenis s3. Ts s3. Gebeurtenis
s1 X X X X
s2 X X
s3 1 00:08:00 "Starten" 00:11:00 "E" 00:12:00 "Stop"

Uiteindelijke uitvoer

Ts Gebeurtenis m_id
00:01:00 Starten 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Stoppen 0
00:08:00 Starten 1
00:11:00 E 1
00:12:00 Stoppen 1