Operador de análise
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Avalia uma expressão de cadeia de caracteres e analisa seu valor em uma ou mais colunas calculadas. As colunas calculadas retornam valores de null
para cadeias de caracteres analisadas sem êxito. Se não houver necessidade de usar linhas em que a análise não seja bem-sucedida, prefira usar o operador parse-where.
Sintaxe
T| parse
[ kind=
kind [ flags=
regexFlags ]] expressionwith
[ *
] stringConstantcolumnName [:
columnType] [ *
] ,
...
Saiba mais sobre convenções de sintaxe.
Parâmetros
Designação | Tipo | Necessário | Descrição |
---|---|---|---|
T | string |
✔️ | A entrada tabular a ser analisada. |
tipo | string |
✔️ | Um dos valores de tipo suportados. O valor padrão é simple . |
regexFlags | string |
Se tipo for regex , você poderá especificar sinalizadores regex a serem usados como U para não ganancioso, m para modo de várias linhas, s para corresponder a novos \n de linha e i para diferenciar maiúsculas de minúsculas. Mais bandeiras podem ser encontradas em Flags. |
|
expressão | string |
✔️ | Uma expressão que é avaliada como uma cadeia de caracteres. |
stringConstant | string |
✔️ | Uma constante de cadeia de caracteres para a qual pesquisar e analisar. |
columnName | string |
✔️ | O nome de uma coluna à qual atribuir um valor, extraído da expressão de cadeia de caracteres. |
columnType | string |
O valor escalar que indica o tipo para o qual converter o valor. O padrão é string . |
Observação
- O padrão de análise pode começar com ColumnName, além de StringConstant.
- Use
*
no padrão para ignorar valores de lixo. O*
não pode ser usado após uma coluna destring
tipo. - Se a expressão analisada não for do tipo
string
, ela será convertida em tipostring
. - Use
project
se também quiser soltar ou renomear algumas colunas.
Valores de kind
suportados
Texto | Descrição |
---|---|
simple |
Este é o valor padrão. stringConstant é um valor de cadeia de caracteres regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários. |
regex |
stringConstant pode ser uma expressão regular e a correspondência é estrita. Todos os delimitadores de cadeia de caracteres, que podem ser um regex para esse modo, devem aparecer na cadeia de caracteres analisada e todas as colunas estendidas devem corresponder aos tipos necessários. |
relaxed |
stringConstant é um valor de cadeia de caracteres regular e a correspondência é relaxada. Todos os delimitadores de cadeia de caracteres devem aparecer na cadeia de caracteres analisada, mas as colunas estendidas podem corresponder parcialmente aos tipos necessários. As colunas estendidas que não correspondem aos tipos necessários obtêm o valor null . |
Modo Regex
No modo regex, parse traduz o padrão para um regex. Use expressões regulares para fazer a correspondência e usar grupos capturados numerados que são manipulados internamente. Por exemplo:
parse kind=regex Col with * <regex1> var1:string <regex2> var2:long
Na instrução parse, o regex gerado internamente pela análise é .*?<regex1>(.*?)<regex2>(\-\d+)
.
*
foi traduzido para.*?
.string
foi traduzido para.*?
.long
foi traduzido para\-\d+
.
Devoluções
A tabela de entrada estendida de acordo com a lista de colunas que são fornecidas ao operador.
Exemplos
Os exemplos nesta seção mostram como usar a sintaxe para ajudá-lo a começar.
Os exemplos neste artigo usam tabelas disponíveis publicamente no de cluster de ajuda, como a tabela
StormEvents
no banco de dados Samples.
Os exemplos neste artigo usam tabelas disponíveis publicamente, como a tabela
StormEvents
na análise do tempo dados de exemplo.
O operador parse
fornece uma maneira simplificada de extend
uma tabela usando vários aplicativos extract
na mesma expressão string
. Esse resultado é útil quando a tabela tem uma coluna string
que contém vários valores que você deseja dividir em colunas individuais. Por exemplo, uma coluna produzida por uma instrução de rastreamento de desenvolvedor ("printf
"/"Console.WriteLine
").
Analise e estenda os resultados
No exemplo a seguir, a coluna EventText
da tabela Traces
contém cadeias de caracteres do formulário Event: NotifySliceRelease (resourceName={0}, totalSlices={1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})
.
A operação estende a tabela com seis colunas: resourceName
, totalSlices
, sliceNumber
, lockTime
, releaseTime
e previousLockTime
.
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *
| project resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime
Output
nome_do_recurso | totalFatias | fatiaNúmero | lockTime | releaseTime | anteriorLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 15 | 02/17/2016 08:40:00 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:39:00.0000000 |
PipelineScheduler | 27 | 23 | 02/17/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 20 | 02/17/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 16 | 02/17/2016 08:41:00 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
Extrair alias de e-mail e DNS
No exemplo a seguir, as entradas da tabela Contatos do são analisadas para extrair o alias e o domínio de um endereço de email e o domínio de uma URL de site. A consulta retorna as colunas EmailAddress
, EmailAlias
e WebsiteDomain
, onde a coluna fullEmail
combina os aliases e domínios de email analisados.
let Leads=datatable(Contacts: string)
[
"Event: LeadContact (email=john@contosohotel.com, Website=https:contosohotel.com)",
"Event: LeadContact (email=abi@fourthcoffee.com, Website=https:www.fourthcoffee.com)",
"Event: LeadContact (email=nevena@treyresearch.com, Website=https:treyresearch.com)",
"Event: LeadContact (email=faruk@tailspintoys.com, Website=https:tailspintoys.com)",
"Event: LeadContact (email=ebere@relecloud.com, Website=https:relecloud.com)",
];
Leads
| parse Contacts with * "email=" alias:string "@" domain: string ", Website=https:" WebsiteDomain: string ")"
| project EmailAddress=strcat(alias, "@", domain), EmailAlias=alias, WebsiteDomain
Output
Endereço de e-mail | Endereço electrónicoAlias | WebsiteDomain |
---|---|---|
nevena@treyresearch.com | Nevena | treyresearch.com |
john@contosohotel.com | John | contosohotel.com |
faruk@tailspintoys.com | Faruk | tailspintoys.com |
ebere@relecloud.com | Ebère | relecloud.com |
abi@fourthcoffee.com | ABI | www.fourthcoffee.com |
Modo Regex
No exemplo a seguir, expressões regulares são usadas para analisar e extrair dados da coluna EventText
. Os dados extraídos são projetados em novos campos.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=regex EventText with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber: long ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime: date "\\)"
| project resourceName, sliceNumber, lockTime, releaseTime, previousLockTime
Output
nome_do_recurso | fatiaNúmero | lockTime | releaseTime | anteriorLockTime |
---|---|---|---|---|
PipelineScheduler | 15 | 02/17/2016 08:40:00, | 02/17/2016 08:40:00, | 2016-02-17 08:39:00.0000000 |
PipelineScheduler | 23 | 02/17/2016 08:40:01, | 02/17/2016 08:40:01, | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 20 | 02/17/2016 08:40:01, | 02/17/2016 08:40:01, | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 16 | 02/17/2016 08:41:00, | 02/17/2016 08:41:00, | 2016-02-17 08:40:00.0000000 |
PipelineScheduler | 22 | 02/17/2016 08:41:01, | 02/17/2016 08:41:00, | 2016-02-17 08:40:01.0000000 |
Modo Regex com sinalizadores regex
No exemplo a seguir, resourceName
é extraído.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=regex EventText with * "resourceName=" resourceName ',' *
| project resourceName
Output
nome_do_recurso |
---|
PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=17/02/2016 08:40:01, releaseTime=17/02/2016 08:40:01 |
PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=17/02/2016 08:40:00, releaseTime=17/02/2016 08:40:00 |
PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=17/02/2016 08:40:01, releaseTime=17/02/2016 08:40:01 |
PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=17/02/2016 08:41:01, releaseTime=17/02/2016 08:41:00 |
PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=17/02/2016 08:41:00, releaseTime=17/02/2016 08:41:00 |
Se houver registros em que resourceName
às vezes aparece como minúscula e às vezes como maiúscula, você pode obter nulos para alguns valores.
Os resultados no exemplo anterior são inesperados e incluem dados de evento completos, uma vez que o modo padrão é ganancioso.
Para extrair apenas resourceName
, execute a consulta anterior com o U
não ganancioso e desative os sinalizadores regex i
diferenciadores de maiúsculas e minúsculas.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=regex flags=Ui EventText with * "RESOURCENAME=" resourceName ',' *
| project resourceName
Output
nome_do_recurso |
---|
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
PipelineScheduler |
Se a cadeia de caracteres analisada tiver novas linhas, use o sinalizador s
, para analisar o texto.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=23\nlockTime=02/17/2016 08:40:01\nreleaseTime=02/17/2016 08:40:01\npreviousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=15\nlockTime=02/17/2016 08:40:00\nreleaseTime=02/17/2016 08:40:00\npreviousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=20\nlockTime=02/17/2016 08:40:01\nreleaseTime=02/17/2016 08:40:01\npreviousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=22\nlockTime=02/17/2016 08:41:01\nreleaseTime=02/17/2016 08:41:00\npreviousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=16\nlockTime=02/17/2016 08:41:00\nreleaseTime=02/17/2016 08:41:00\npreviousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=regex flags=s EventText with * "resourceName=" resourceName: string "(.*?)totalSlices=" totalSlices: long "(.*?)lockTime=" lockTime: datetime "(.*?)releaseTime=" releaseTime: datetime "(.*?)previousLockTime=" previousLockTime: datetime "\\)"
| project-away EventText
Output
nome_do_recurso | totalFatias | lockTime | releaseTime | anteriorLockTime |
---|---|---|---|---|
PipelineScheduler |
27 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:40:00.0000000 | 2016-02-17 08:39:00.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 |
PipelineScheduler |
27 | 2016-02-17 08:41:01.0000000 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
Modo descontraído
No exemplo de modo relaxado a seguir, a coluna estendida totalSlices
deve ser do tipo long
. No entanto, na cadeia de caracteres analisada, ele tem o valor nonValidLongValue
.
Para a coluna estendida, releaseTime
, o valor nonValidDateTime
não pode ser analisado como datetime
.
Essas duas colunas estendidas resultam em valores null
, enquanto as outras colunas, como sliceNumber
, ainda resultam nos valores corretos.
Se você usar a opção kind = simple
para a consulta a seguir, obterá resultados null
para todas as colunas estendidas. Esta opção é estrita em colunas estendidas e é a diferença entre o modo relaxado e simples.
Observação
No modo descontraído, as colunas estendidas podem ser parcialmente combinadas.
let Traces=datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=nonValidDateTime 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=nonValidDateTime, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=nonValidLongValue, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=nonValidDateTime 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=nonValidLongValue, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse kind=relaxed EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long ", sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *
| project-away EventText
Output
nome_do_recurso | totalFatias | fatiaNúmero | lockTime | releaseTime | anteriorLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 15 | 02/17/2016 08:40:00 | 2016-02-17 08:39:00.0000000 | |
PipelineScheduler | 27 | 23 | 02/17/2016 08:40:01 | 2016-02-17 08:39:01.0000000 | |
PipelineScheduler | 20 | 02/17/2016 08:40:01 | 2016-02-17 08:39:01.0000000 | ||
PipelineScheduler | 16 | 02/17/2016 08:41:00 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:00.0000000 | |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |