operador de análise

Analisa dados, correspondências e compila sequências com base nos predicados.

Os registos correspondentes são determinados de acordo com os predicados definidos nos passos do operador. Um predicado pode depender do estado gerado pelos passos anteriores. O resultado do registo correspondente é determinado pelo registo de entrada e pelas atribuições definidas nos passos do operador.

Syntax

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

Sintaxe ColumnDeclarations

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

Sintaxe StepDefinition

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

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
T string ✔️ A origem tabular de entrada.
MatchIdColumnName string O nome de uma coluna do tipo long que é anexada à saída como parte da execução da análise. Indica o índice baseado em 0 da correspondência do registo.
ColumnDeclarations string Declara uma extensão ao esquema de T. Estas colunas são valores atribuídos nos passos. Se não estiver atribuído, é devolvido DefaultValue . Salvo especificação em contrário, DefaultValue é null.
StepName string ✔️ Utilizado para referenciar valores no estado da análise de condições e atribuições. O nome do passo tem de ser exclusivo.
Condition string ✔️ Uma expressão que avalia true ou false define quais os registos da entrada que correspondem ao passo. Um registo corresponde ao passo quando a condição está true com o estado do passo ou com o estado do passo anterior.
Atribuição string Uma expressão escalar atribuída à coluna correspondente quando um registo corresponde a um passo.
output string Controla a lógica de saída do passo em correspondências repetidas. all produz todos os registos correspondentes ao passo, last produz apenas o último registo numa série de correspondências de repetição para o passo e none não produz registos correspondentes ao passo. A predefinição é all.

Devoluções

Um registo para cada correspondência de um registo da entrada para um passo. O esquema da saída é o esquema da origem expandido com a coluna na declare cláusula .

Lógica de análise

scan passa por cima dos dados de entrada serializados, regista por registo, comparando cada registo com a condição de cada passo, tendo em conta o estado atual de cada passo.

Estado

O estado subjacente do scan operador pode ser considerado como uma tabela com uma linha para cada step. Cada passo mantém o seu próprio estado com os valores mais recentes das colunas e variáveis declaradas de todos os passos anteriores e do passo atual. Se for relevante, também contém o ID de correspondência da sequência em curso.

Se um operador de análise tiver n passos denominados s_1, s_2, ..., s_n , s_k passo teria registos K no estado correspondentes a s_1, s_2, ..., s_k. O StepName. O formato ColumnName é utilizado para referenciar um valor no estado . Por exemplo, s_2.col1 referenciaria a coluna col1 que pertence ao passo s_2 no estado de s_k. Para obter um exemplo detalhado, veja as instruções da lógica de análise.

O estado começa vazio e é atualizado sempre que um registo de entrada digitalizado corresponder a um passo. Quando o estado do passo atual é não atualizado, o passo é referido como tendo uma sequência ativa.

Lógica de correspondência

Cada registo de entrada é avaliado em relação a todos os passos por ordem inversa, do último passo ao primeiro. Quando um registo r é avaliado em relação a alguns passos s_k, é aplicada a seguinte lógica:

  • Verificar 1: Se o estado do passo anterior (s_k-1) for nenhum e r cumprir a Condição de s_k, ocorrerá uma correspondência. A correspondência conduz às seguintes ações:

    1. O estado de s_k é limpo.
    2. O estado de s_k-1 é promovido para se tornar o estado de s_k.
    3. As atribuições de s_k são calculadas e expandem r.
    4. O r expandido é adicionado à saída e ao estado de s_k.

    Nota

    Se a opção Verificar 1 resultar numa correspondência, a verificação 2 é ignorada e r avança para ser avaliada relativamente a s_k-1.

  • Verificar 2: Se o estado de s_k tiver uma sequência ativa ou s_k for o primeiro passo e r cumprir a Condição de s_k, ocorrerá uma correspondência. A correspondência conduz às seguintes ações:

    1. As atribuições de s_k são calculadas e expandem r.
    2. Os valores que representam s_k no estado de s_k são substituídos pelos valores do r expandido.
    3. Se s_k for definido como output=all, o r expandido é adicionado à saída.
    4. Se s_k for o primeiro passo, é iniciada uma nova sequência e o ID de correspondência aumenta em 1. Isto só afeta o resultado quando with_match_id é utilizado.

Assim que as verificações de s_k estiverem concluídas, o r avança para ser avaliado relativamente a s_k-1.

Para obter um exemplo detalhado desta lógica, veja as instruções da lógica de análise.

Exemplos

Soma cumulativa

Calcular a soma cumulativa de uma coluna de entrada. O resultado deste exemplo é equivalente à utilização de 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;
)

Saída

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

Soma cumulativa em múltiplas colunas com uma condição de reposição

Calcule a soma cumulativa de duas colunas de entrada, reponha o valor de soma para o valor de registo atual sempre que a soma cumulativa atingir 10 ou mais.

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

Saída

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

Preencher uma coluna para a frente

Preencha uma coluna de cadeia. A cada valor vazio é atribuído o último valor não visto.

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

Saída

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

Etiquetagem de sessões

Divida a entrada em sessões: uma sessão termina 30 minutos após o primeiro evento da sessão, após o qual é iniciada uma nova sessão. Tenha em atenção a utilização do with_match_id sinalizador, que atribui um valor exclusivo para cada correspondência distinta (sessão) da análise. Tenha também em atenção que a utilização especial de dois passos neste exemplo tem true como condição, inSession pelo que captura e produz todos os registos da entrada enquanto endSession captura registos que ocorrem a mais de 30 m do sessionStart valor da correspondência atual. O endSession passo significa output=none que não produz registos de saída. O endSession passo é utilizado para avançar o estado da correspondência atual de inSession para endSession, permitindo o início de uma nova correspondência (sessão), a partir do registo atual.

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

Saída

Ts Evento início de sessão 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

Eventos entre Iniciar e Parar

Localize todas as sequências de eventos entre o evento Start e o evento Stop que ocorrem dentro de 5 minutos. Atribua um ID de correspondência para cada sequência.

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

Saída

Ts Evento m_id
00:01:00 Iniciar 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Parar 0
00:08:00 Iniciar 1
00:11:00 E 1
00:12:00 Parar 1

Calcular um funil personalizado de eventos

Calcular uma conclusão de funil da sequência Hail –>TornadoThunderstorm Wind> com State limiares personalizados nas horas entre os eventos (Tornado dentro 1h e Thunderstorm Wind dentro 2hde ). Este exemplo é semelhante ao plug-in funnel_sequence_completion, mas permite uma maior flexibilidade.

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

Saída

EventType dcount_State
Granizo 50
Tornado 34
Vento trovoada 32

Analisar instruções lógicas

Esta secção demonstra a lógica de análise com uma instruções passo a passo dos Eventos entre o exemplo de início e paragem :

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

O estado

Pense no estado do operador como uma tabela com uma linha para cada passo, em que cada passo tem o scan seu próprio estado. Este estado contém os valores mais recentes das colunas e variáveis declaradas de todos os passos anteriores e do passo atual. Para saber mais, consulte Estado.

Neste exemplo, o estado pode ser representado com a seguinte tabela:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3

O "X" indica que um campo específico é irrelevante para esse passo.

A lógica correspondente

Esta secção segue a lógica correspondente através de cada registo da Events tabela, explicando a transformação do estado e da saída em cada passo.

Nota

Um registo de entrada é avaliado em relação aos passos por ordem inversa, desde o último passo (s3) até ao primeiro passo (s1).

Registo 1

Ts Evento
0m "A"

Avaliação de registos em cada passo:

  • s3: a verificação 1 não é transmitida porque o estado de s2 está vazio e Verificar 2 não é transmitido porque s3 não tem uma sequência ativa.
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e Verificar 2 não é transmitido porque s2 não tem uma sequência ativa.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior. A verificação 2 não é transmitida porque o registo não cumpre a condição de Event == "Start". O registo 1 é eliminado sem afetar o estado ou a saída.

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3

Registo 2

Ts Evento
1 m "Iniciar"

Avaliação de registos em cada passo:

  • s3: a verificação 1 não é transmitida porque o estado de s2 está vazio e a opção Verificar 2 não é transmitida porque s3 não tem uma sequência ativa.
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e a opção Verificar 2 não é transmitida porque s2 não tem uma sequência ativa.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior. Verifique se 2 é transmitido porque o registo cumpre a condição de Event == "Start". Esta correspondência inicia uma nova sequência e é m_id atribuída. O registo 2 e o respetivo m_id (0) são adicionados ao estado e à saída.

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 0 00:01:00 "Iniciar" X X X X
s2 X X
s3

Registo 3

Ts Evento
2m "B"

Avaliação de registos em cada passo:

  • s3: a verificação 1 não é transmitida porque o estado de s2 está vazio e a opção Verificar 2 não é transmitida porque s3 não tem uma sequência ativa.
  • s2: verifique se 1 é transmitido porque o estado de s1 é não atualizado e o registo cumpre a condição de Ts - s1.Ts < 5m. Esta correspondência faz com que o estado de s1 seja limpo e a sequência em s1 seja promovida para s2. O registo 3 e o respetivo m_id (0) são adicionados ao estado e à saída.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior e a opção Verificar 2 não foi aprovada porque o registo não cumpre a condição de Event == "Start".

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 0 00:01:00 "Iniciar" 00:02:00 "B" X X
s3

Registo 4

Ts Evento
3m "D"

Avaliação de registos em cada passo:

  • s3: a verificação 1 não é transmitida porque o registo não cumpre a condição de Event == "Stop"e a opção Verificar 2 não é transmitida porque s3 não tem uma sequência ativa.
  • s2: Verifique se 1 não é transmitido porque o estado de s1 está vazio. transmite a Verificação 2 porque cumpre a condição de Ts - s1.Ts < 5m. O registo 4 e o respetivo m_id (0) são adicionados ao estado e à saída. Os valores deste registo substituem os valores de estado anteriores para s2.Ts e s2.Event.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior e a opção Verificar 2 não foi aprovada porque o registo não cumpre a condição de Event == "Start".

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 0 00:01:00 "Iniciar" 00:03:00 "D" X X
s3

Registo 5

Ts Evento
4m "Parar"

Avaliação de registos em cada passo:

  • s3: Verifique se 1 é transmitido porque s2 não tem limite e cumpre a s3 condição de Event == "Stop". Esta correspondência faz com que o estado de s2 ser limpo e a sequência em s2 seja promovida para s3. O registo 5 e o respetivo m_id (0) são adicionados ao estado e à saída.
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e Verificar 2 não é transmitido porque s2 não tem uma sequência ativa.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior. A verificação 2 não é transmitida porque o registo não cumpre a condição de Event == "Start".

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 0 00:01:00 "Iniciar" 00:03:00 "D" 00:04:00 "Parar"

Registo 6

Ts Evento
6m "C"

Avaliação de registos em cada passo:

  • s3: a verificação 1 não é transmitida porque o estado de s2 está vazio e Verificar 2 não é transmitido porque s3 não cumpre a s3 condição de Event == "Stop".
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e Verificar 2 não é transmitido porque s2 não tem uma sequência ativa.
  • s1: a verificação 1 não é aprovada porque não existe nenhum passo anterior e Verifique se 2 não é transmitido porque não cumpre a condição de Event == "Start". O registo 6 é eliminado sem afetar o estado ou a saída.

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 0 00:01:00 "Iniciar" 00:03:00 "D" 00:04:00 "Parar"

Registo 7

Ts Evento
8m "Iniciar"

Avaliação de registos em cada passo:

  • s3: Verifique se 1 não é transmitido porque o estado de s2 está vazio e Verificar 2 não é transmitido porque não cumpre a condição de Event == "Stop".
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e Verificar 2 não é transmitido porque s2 não tem uma sequência ativa.
  • s1: a verificação 1 não é transmitida porque não existe nenhum passo anterior. passa a Verificação 2 porque cumpre a condição de Event == "Start". Esta correspondência inicia uma nova sequência com s1 um novo m_id. O registo 7 e o respetivo m_id (1) são adicionados ao estado e à saída.

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 1 00:08:00 "Iniciar" X X X X
s2 X X
s3 0 00:01:00 "Iniciar" 00:03:00 "D" 00:04:00 "Parar"

Nota

Existem agora duas sequências ativas no estado.

Registo 8

Ts Evento
11m "E"

Avaliação de registos em cada passo:

  • s3: Verifique se 1 não é transmitido porque o estado de s2 está vazio e Verificar 2 não é transmitido porque não cumpre a s3 condição de Event == "Stop".
  • s2: a verificação 1 é transmitida porque o estado de s1 não está correto e o registo cumpre a condição de Ts - s1.Ts < 5m. Esta correspondência faz com que o estado de s1 ser limpo e a sequência em s1 seja promovida para s2. O registo 8 e o respetivo m_id (1) são adicionados ao estado e à saída.
  • s1: Verifique se 1 é irrelevante porque não existe nenhum passo anterior e Verificar 2 não é transmitido porque o registo não cumpre a condição de Event == "Start".

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 1 00:08:00 "Iniciar" 00:11:00 "E" X X
s3 0 00:01:00 "Iniciar" 00:03:00 "D" 00:04:00 "Parar"

Registo 9

Ts Evento
12m "Parar"

Avaliação de registos em cada passo:

  • s3: Verifique se 1 é transmitido porque s2 não tem limite e cumpre a s3 condição de Event == "Stop". Esta correspondência faz com que o estado de s2 ser limpo e a sequência em s2 seja promovida para s3. O registo 9 e o respetivo m_id (1) são adicionados ao estado e à saída.
  • s2: a verificação 1 não é transmitida porque o estado de s1 está vazio e Verificar 2 não é transmitido porque s2 não tem uma sequência ativa.
  • s1: a verificação 1 não é transmitida porque não existe nenhum passo anterior. passa a Verificação 2 porque cumpre a condição de Event == "Start". Esta correspondência inicia uma nova sequência com s1 um novo m_id.

Estado:

passo m_id s1. Ts s1. Evento s2. Ts s2. Evento s3. Ts s3. Evento
s1 X X X X
s2 X X
s3 1 00:08:00 "Iniciar" 00:11:00 "E" 00:12:00 "Parar"

Resultado final

Ts Evento m_id
00:01:00 Iniciar 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Parar 0
00:08:00 Iniciar 1
00:11:00 E 1
00:12:00 Parar 1