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
step
StepName [ 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:
- O estado de s_k é limpo.
- O estado de s_k-1 é promovido para se tornar o estado de s_k.
- As atribuições de s_k são calculadas e expandem r.
- 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:
- As atribuições de s_k são calculadas e expandem r.
- Os valores que representam s_k no estado de s_k são substituídos pelos valores do r expandido.
- Se s_k for definido como
output=all
, o r expandido é adicionado à saída. - 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 quandowith_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
–>Tornado
Thunderstorm Wind
> com State
limiares personalizados nas horas entre os eventos (Tornado
dentro 1h
e Thunderstorm Wind
dentro 2h
de ). 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 des2
está vazio e Verificar 2 não é transmitido porques3
não tem uma sequência ativa.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e Verificar 2 não é transmitido porques2
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 deEvent == "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 des2
está vazio e a opção Verificar 2 não é transmitida porques3
não tem uma sequência ativa.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e a opção Verificar 2 não é transmitida porques2
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 deEvent == "Start"
. Esta correspondência inicia uma nova sequência e ém_id
atribuída. O registo 2 e o respetivom_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 des2
está vazio e a opção Verificar 2 não é transmitida porques3
não tem uma sequência ativa.s2
: verifique se 1 é transmitido porque o estado des1
é não atualizado e o registo cumpre a condição deTs - s1.Ts < 5m
. Esta correspondência faz com que o estado des1
seja limpo e a sequência ems1
seja promovida paras2
. O registo 3 e o respetivom_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 deEvent == "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 deEvent == "Stop"
e a opção Verificar 2 não é transmitida porques3
não tem uma sequência ativa.s2
: Verifique se 1 não é transmitido porque o estado des1
está vazio. transmite a Verificação 2 porque cumpre a condição deTs - s1.Ts < 5m
. O registo 4 e o respetivom_id
(0
) são adicionados ao estado e à saída. Os valores deste registo substituem os valores de estado anteriores paras2.Ts
es2.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 deEvent == "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 porques2
não tem limite e cumpre as3
condição deEvent == "Stop"
. Esta correspondência faz com que o estado des2
ser limpo e a sequência ems2
seja promovida paras3
. O registo 5 e o respetivom_id
(0
) são adicionados ao estado e à saída.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e Verificar 2 não é transmitido porques2
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 deEvent == "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 des2
está vazio e Verificar 2 não é transmitido porques3
não cumpre as3
condição deEvent == "Stop"
.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e Verificar 2 não é transmitido porques2
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 deEvent == "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 des2
está vazio e Verificar 2 não é transmitido porque não cumpre a condição deEvent == "Stop"
.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e Verificar 2 não é transmitido porques2
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 deEvent == "Start"
. Esta correspondência inicia uma nova sequência coms1
um novom_id
. O registo 7 e o respetivom_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 des2
está vazio e Verificar 2 não é transmitido porque não cumpre as3
condição deEvent == "Stop"
.s2
: a verificação 1 é transmitida porque o estado des1
não está correto e o registo cumpre a condição deTs - s1.Ts < 5m
. Esta correspondência faz com que o estado des1
ser limpo e a sequência ems1
seja promovida paras2
. O registo 8 e o respetivom_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 deEvent == "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 porques2
não tem limite e cumpre as3
condição deEvent == "Stop"
. Esta correspondência faz com que o estado des2
ser limpo e a sequência ems2
seja promovida paras3
. O registo 9 e o respetivom_id
(1
) são adicionados ao estado e à saída.s2
: a verificação 1 não é transmitida porque o estado des1
está vazio e Verificar 2 não é transmitido porques2
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 deEvent == "Start"
. Esta correspondência inicia uma nova sequência coms1
um novom_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 |
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários