operador mv-expand

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

mv-expand pode ser descrito como o oposto dos operadores de agregação que empacotam vários valores em apenas uma matriz de tipo dinâmico ou conjunto de propriedades, como summarize ... make-list() e make-series. Cada elemento na matriz (escalar) ou no recipiente 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.

Syntax

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

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

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Obrigatório Descrição
ColumnName, ArrayExpression string ✔️ Uma referência de coluna ou uma expressão escalar com um valor do tipo dynamic que contém uma matriz ou um recipiente de propriedades. Os elementos individuais de nível superior da matriz ou do recipiente de propriedades são expandidos em vários registros.
Quando ArrayExpression é usado 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 é 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 é somente 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 se tornam null valores.
Rowlimit int O número máximo de linhas geradas a partir de cada linha original. O padrão é 2147483647. mvexpand é uma forma herdada 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 começando em 0 do item na coleção expandida original.

Retornos

Para cada registro na entrada, o operador retorna zero, um ou vários 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 o valor original delas. Se apenas um 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 que é expandido, 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 propriedade 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 ou no conjunto original.

  3. Se o valor dinâmico for nulo, um registro individual será produzido para esse valor nulo. Se o valor dinâmico for uma matriz vazia ou um recipiente de propriedades, nenhum registro será produzido para esse valor. Caso contrário, será produzido um número de registros igual ao número de elementos no valor dinâmico.

As colunas expandidas são do tipo dynamic, a menos que sejam explicitamente tipificadas pelo uso da cláusula to typeof().

Modos de expansão

Há suporte para dois modos de expansões de recipiente de propriedades:

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

Exemplos

Coluna única – expansão de 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 recipiente

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 recipiente para pares chave-valor

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

A expansão das duas colunas compactará primeiro as colunas aplicáveis e as expandirá:

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 você quiser obter um produto cartesiano da 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 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 

Saída

ColumnName ColumnOrdinal DateType ColumnType
um 0 System.String string
b 1 System.Object dynamic
c 2 System.Int32 int

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

Usar 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