operador mv-expand
Expande matrizes dinâmicas de múltiplos valores ou sacos de propriedades em vários registos.
mv-expand
pode ser descrito como o oposto dos operadores de agregação que empacotam múltiplos valores numa única matriz ou saco de propriedades de tipo dinâmico, como summarize
... make-list()
e make-series
.
Cada elemento na matriz (escalar) ou no saco de propriedades gera um novo registo na saída do operador. Todas as colunas da entrada que não são expandidas são duplicadas para todos os registos na saída.
Syntax
T|mv-expand
[kind=
(bag
| array
)] [with_itemindex=
IndexColumnName] ColumnName [to typeof(
Typename)
] [,
ColumnName ...] [limit
Rowlimit]
T|mv-expand
[kind=
(bag
array
| )] [Name=
] ArrayExpression [to typeof(
Typename)
] [,
[Name=
] ArrayExpression [to typeof(
Typename)
] ...] [limit
Rowlimit]
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Tipo | Necessário | Descrição |
---|---|---|---|
ColumnName, ArrayExpression | string |
✔️ | Uma referência de coluna ou uma expressão escalar com um valor de tipo dynamic que contém uma matriz ou um saco de propriedades. Os elementos individuais de nível superior da matriz ou do saco de propriedades são expandidos para vários registos.Quando a MatrizExpressão é utilizada e o Nome não é igual a nenhum nome de coluna de entrada, o valor expandido é expandido para uma nova coluna na saída. Caso contrário, o ColumnName existente é substituído. |
Nome | string |
Um nome para a nova coluna. | |
Typename | string |
✔️ | Indica o tipo subjacente dos elementos da matriz, que se torna o tipo da coluna produzida pelo mv-expand operador. A operação de aplicação do tipo é apenas cast e não inclui análise ou conversão de tipo. Os elementos de matriz que não estão em conformidade com o tipo declarado tornam-se null valores. |
RowLimit | int |
O número máximo de linhas geradas a partir de cada linha original. A predefinição é 2147483647. mvexpand é uma forma legada e obsoleta do operador mv-expand . A versão legada tem um limite de linha predefinido de 128. |
|
IndexColumnName | string |
Se with_itemindex for especificado, o resultado inclui outra coluna com o nome IndexColumnName que contém o índice a partir de 0 do item na coleção expandida original. |
Devoluções
Para cada registo na entrada, o operador devolve zero, um ou muitos registos na saída, conforme determinado da seguinte forma:
As colunas de entrada que não são expandidas aparecem na saída com o respetivo valor original. Se um único registo de entrada for expandido para vários registos de saída, o valor será duplicado para todos os registos.
Para cada ColumnName ou ArrayExpression que é expandido, o número de registos de saída é determinado para cada valor, conforme explicado em modos de expansão. Para cada registo de entrada, é calculado o número máximo de registos de saída. Todas as matrizes ou sacos de propriedades são expandidos "em paralelo" para que os valores em falta (se existirem) sejam substituídos por valores nulos. Os elementos são expandidos em linhas pela ordem em que aparecem na matriz/saco original.
Se o valor dinâmico for nulo, será produzido um único registo para esse valor (nulo). Se o valor dinâmico for uma matriz vazia ou um saco de propriedades, não é produzido nenhum registo para esse valor. Caso contrário, são produzidos tantos registos como elementos no valor dinâmico.
As colunas expandidas são do tipo dynamic
, a menos que sejam explicitamente digitadas através da to typeof()
cláusula.
Modos de expansão
São suportados dois modos de expansão do saco de propriedades:
kind=bag
oubagexpansion=bag
: os sacos de propriedades são expandidos em sacos de propriedades de entrada única. Este modo é o modo predefinido.kind=array
oubagexpansion=array
: os sacos de propriedades são expandidos em estruturas de matriz devalor]
chave de dois elementos,
[
, permitindo o acesso uniforme a chaves e valores. Este modo também permite, por exemplo, executar uma agregação de contagem distinta sobre nomes de propriedades.
Exemplos
Coluna única - expansão da matriz
datatable (a: int, b: dynamic)
[
1, dynamic([10, 20]),
2, dynamic(['a', 'b'])
]
| mv-expand b
Saída
um | b |
---|---|
1 | 10 |
1 | 20 |
2 | um |
2 | b |
Coluna única - expansão do saco
Uma expansão simples de uma única coluna:
datatable (a: int, b: dynamic)
[
1, dynamic({"prop1": "a1", "prop2": "b1"}),
2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b
Saída
um | b |
---|---|
1 | {"prop1": "a1"} |
1 | {"prop2": "b1"} |
2 | {"prop1": "a2"} |
2 | {"prop2": "b2"} |
Coluna única - expansão do saco para pares chave-valor
Uma expansão simples do saco para pares chave-valor:
datatable (a: int, b: dynamic)
[
1, dynamic({"prop1": "a1", "prop2": "b1"}),
2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand kind=array b
| extend key = b[0], val=b[1]
Saída
um | b | key | val |
---|---|---|---|
1 | ["prop1","a1"] | prop1 | a1 |
1 | ["prop2","b1"] | prop2 | b1 |
2 | ["prop1","a2"] | prop1 | a2 |
2 | ["prop2","b2"] | prop2 | b2 |
Duas colunas zipadas
Expandir duas colunas irá primeiro "zipar" as colunas aplicáveis e, em seguida, expandi-las:
datatable (a: int, b: dynamic, c: dynamic)[
1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 4, 3])
]
| mv-expand b, c
Saída
um | b | c |
---|---|---|
1 | {"prop1":"a"} | 5 |
1 | {"prop2":"b"} | 4 |
1 | 3 |
Produto cartesiano de duas colunas
Se quiser obter um produto cartesiano de expansão de duas colunas, expanda uma após a outra:
datatable (a: int, b: dynamic, c: dynamic)
[
1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 6])
]
| mv-expand b
| mv-expand c
Saída
um | b | c |
---|---|---|
1 | { "prop1": "a"} | 5 |
1 | { "prop1": "a"} | 6 |
1 | { "prop2": "b"} | 5 |
1 | { "prop2": "b"} | 6 |
Converter saída
Para forçar a saída de um mv-expand para um determinado tipo (a predefinição é dinâmica), utilize to typeof
:
datatable (a: string, b: dynamic, c: dynamic)[
"Constant", dynamic([1, 2, 3, 4]), dynamic([6, 7, 8, 9])
]
| mv-expand b, c to typeof(int)
| getschema
Saída
ColumnName | ColumnOrdinal | DateType | ColumnType |
---|---|---|---|
um | 0 | System.String | string |
b | 1 | System.Object | dynamic |
c | 2 | System.Int32 | int |
Repare que a coluna b
é devolvida como dynamic
quando c
é devolvida como int
.
Utilizar with_itemindex
Expansão de uma matriz com with_itemindex
:
range x from 1 to 4 step 1
| summarize x = make_list(x)
| mv-expand with_itemindex=Index x
Saída
x | Índice |
---|---|
1 | 0 |
2 | 1 |
3 | 2 |
4 | 3 |
Conteúdo relacionado
- Para obter mais exemplos, veja Contagem de gráficos de atividades em direto ao longo do tempo.
- operador mv-apply.
- Para o oposto do operador mv-expand, veja resumir make_list().
- Para expandir objetos JSON dinâmicos em colunas com chaves de saco de propriedades, veja plug-in bag_unpack( ).
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