Partilhar via


Operador MV-Expand

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Expande matrizes dinâmicas de vários valores ou pacotes de propriedades em vários registros.

mv-expand pode ser descrito como o oposto dos operadores de agregação que empacotam vários valores em um único matrizdinâmica ou pacote de propriedades, como summarize ... make-list() e make-series. Cada elemento na matriz (escalar) ou saco de propriedades gera um novo registro na saída do operador. Todas as colunas da entrada que não são expandidas são duplicadas para todos os registros na saída.

Sintaxe

T|mv-expand [kind=(bag | array)] [with_itemindex=IndexColumnName] ColumnName [to typeof(Typename)] [,ColumnName ...] [limitRowlimit]

T|mv-expand [kind=(bag | array)] [ Nome=] ArrayExpression [to typeof(Typename)] [, [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]

Saiba mais sobre convenções de sintaxe.

Parâmetros

Designação Tipo Necessário Descrição
ColumnNameArrayExpression string ✔️ Uma referência de coluna ou uma expressão escalar com um valor do tipo dynamic que contém uma matriz ou um conjunto de propriedades. Os elementos individuais de nível superior da matriz ou do pacote de propriedades são expandidos em vários registros.
Quando ArrayExpression é usada e Name não é igual a nenhum nome de coluna de entrada, o valor expandido é estendido para uma nova coluna na saída. Caso contrário, o ColumnName existente será 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 operador mv-expand. A operação de aplicação do tipo é somente de conversão 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 valores null.
RowLimit int O número máximo de linhas geradas a partir de cada linha original. O padrão é 2147483647. mvexpand é uma forma legada e obsoleta do operador mv-expand. A versão herdada tem um limite de linha padrão de 128.
IndexColumnName string Se with_itemindex for especificado, a saída incluirá outra coluna chamada IndexColumnName que contém o índice a partir de 0 do item na coleção expandida original.

Devoluções

Para cada registro na entrada, o operador retorna zero, um ou muitos registros na saída, conforme determinado da seguinte maneira:

  1. As colunas de entrada que não são expandidas aparecem na saída com seu valor original. Se um único registro de entrada for expandido em vários registros de saída, o valor será duplicado para todos os registros.

  2. Para cada ColumnName ou ArrayExpression expandida, o número de registros de saída é determinado para cada valor, conforme explicado em modos de expansão. Para cada registro de entrada, o número máximo de registros de saída é calculado. Todas as matrizes ou pacotes de propriedades são expandidos "em paralelo" para que os valores ausentes (se houver) sejam substituídos por valores nulos. Os elementos são expandidos em linhas na ordem em que aparecem na matriz/saco original.

  3. Se o valor dinâmico for null, um único registro será produzido para esse valor (null). Se o valor dinâmico for uma matriz vazia ou um conjunto de propriedades, nenhum registro será produzido para esse valor. Caso contrário, são produzidos tantos registos quantos forem os elementos no valor dinâmico.

As colunas expandidas são do tipo dynamic, a menos que sejam explicitamente digitadas usando a cláusula to typeof().

Modos de expansão

São suportados dois modos de expansão de sacos de propriedade:

  • kind=bag ou bagexpansion=bag: Os sacos de propriedade são expandidos em sacos de propriedade de entrada única. Este modo é o modo padrão.
  • kind=array ou bagexpansion=array: Os sacos de propriedade são expandidos em dois elementos [chave,valor] estruturas de matriz, permitindo acesso uniforme a chaves e valores. Esse modo também permite, por exemplo, executar uma agregação de contagem distinta sobre nomes de propriedade.

Exemplos

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.

Os exemplos nesta seção mostram como usar a sintaxe para ajudá-lo a começar.

Coluna única - expansão de matriz

datatable (a: int, b: dynamic)
[
    1, dynamic([10, 20]),
    2, dynamic(['a', 'b'])
]
| mv-expand b

Output

um b
1 10
1 20
2 um
2 b

Coluna única - expansão do saco

Uma simples expansão de uma única coluna:

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b

Output

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 simples expansão de 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]

Output

um b chave Val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

Duas colunas compactadas

Expandir duas colunas primeiro 'zip' 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

Output

um b c
1 {"prop1":"a"} 5
1 {"prop2":"b"} 4
1 3

Produto cartesiano de duas colunas

Se você 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

Output

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 (o padrão é dinâmico), use 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 

Output

Nome da coluna ColumnOrdinal Tipo de Data Tipo de coluna
um 0 System.String string
b 1 System.Object dynamic
c 2 Sistema.Int32 int

Observe que a coluna b é retornada como dynamic enquanto c é retornada como int.

Usando 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

Output

x Índice
1 0
2 1
3 2
4 3