Operador mv-expand

Expande matrices dinámicas de varios valores o contenedores de propiedades en varios registros.

mv-expand se puede describir como lo opuesto a los operadores de agregación que empaquetan varios valores en una única matriz de tipodinámicoo contenedor de propiedades, como summarize ... make-list() y make-series. Cada elemento de la matriz (escalar) o del contenedor de propiedades genera un nuevo registro en la salida del operador. Todas las columnas de la entrada que no se expanden se duplican en todos los registros de la salida.

Syntax

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

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

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
ColumnName, ArrayExpression string ✔️ Referencia de columna o expresión escalar con un valor de tipo dynamic que contiene una matriz o un contenedor de propiedades. Los elementos individuales de nivel superior de la matriz o del contenedor de propiedades se expanden en varios registros.
Si se utiliza ArrayExpression y el valor de Name no coincide con el de ningún nombre de columna de entrada, el valor expandido se extiende en una nueva columna de la salida. En caso contrario, se reemplaza el valor de ColumnName.
Nombre string Nombre de la nueva columna.
Typename string ✔️ Indica el tipo subyacente de los elementos de la matriz, que se convierte en el tipo de la columna generada por el mv-expand operador . La operación de aplicar el tipo es de solo conversión y no incluye análisis ni conversión de tipos. Los elementos de matriz que no cumplen con el tipo declarado se convierten en null valores.
RowLimit int Número máximo de filas generadas a partir de cada fila original. El valor predeterminado es 2147483647. mvexpand es una forma heredada y obsoleta del operador mv-expand. La versión heredada tiene un límite de filas predeterminado de 128.
IndexColumnName string Si with_itemindex se especifica , la salida incluye otra columna denominada IndexColumnName que contiene el índice a partir de 0 del elemento de la colección expandida original.

Devoluciones

Para cada registro de la entrada, el operador devuelve cero, uno o muchos registros en la salida, lo que se determina de la siguiente manera:

  1. Las columnas de entrada que no se expanden aparecen en la salida con su valor original. Si un único registro de entrada se expande en varios registros de salida, el valor se duplica en todos los registros.

  2. Para cada ColumnName o ArrayExpression expandido, el número de registros de salida se determina para cada valor, como se explica en modos de expansión. Para cada registro de entrada, se calcula el número máximo de registros de salida. Todas las matrices o contenedores de propiedades se expanden "en paralelo" para que los valores que falten (si los hubiera) se reemplacen por valores NULL. Los elementos se expanden en filas en el orden en que aparecen en la matriz o el contenedor originales.

  3. Si el valor dinámico es NULL, se genera un único registro para él (NULL). Si el valor dinámico es una matriz o un contenedor de propiedades vacíos, no se genera ningún registro para ese valor. En caso contrario, se generan tantos registros como elementos hay en el valor dinámico.

Las columnas expandidas son del tipo dynamic, salvo que se escriban explícitamente mediante la cláusula to typeof().

Modos de expansión

Se admiten dos modos de expansiones de contenedores de propiedades:

  • kind=bag o bagexpansion=bag: Los contenedores de propiedades se expanden en contenedores de propiedades de entrada única. Este modo es el predeterminado.
  • kind=array o bagexpansion=array: Los contenedores de propiedades se expanden en estructuras de matriz de dos elementos [clave, y valor], lo que permite el acceso uniforme a claves y valores. Este modo también permite, por ejemplo, ejecutar una agregación de recuento distintiva sobre los nombres de propiedad.

Ejemplos

Columna única: expansión de matriz

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

Salida

a b
1 10
1 20
2 a
2 b

Columna única: expansión de bolsa

Una simple expansión de una única columna:

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

Salida

a b
1 {"prop1": "a1"}
1 {"prop2": "b1"}
2 {"prop1": "a2"}
2 {"prop2": "b2"}

Columna única: expansión del contenedor a pares clave-valor

Una simple expansión de bolsa a pares clave-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]

Salida

a b key Val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

Dos columnas comprimidas:

Expandir dos columnas primero "comprimirá" las columnas aplicables y, luego, las expandirá:

datatable (a: int, b: dynamic, c: dynamic)[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 4, 3])
]
| mv-expand b, c

Salida

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

Producto cartesiano de dos columnas

Si quiere obtener un producto cartesiano de la expansión de dos columnas, expanda una después de la otra:

datatable (a: int, b: dynamic, c: dynamic)
[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 6])
]
| mv-expand b
| mv-expand c

Salida

a b c
1 { "prop1": "a"} 5
1 { "prop1": "a"} 6
1 { "prop2": "b"} 5
1 { "prop2": "b"} 6

Convertir salida

Para forzar la salida de una operación mv-expand a un tipo determinado (el valor predeterminado es 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 

Salida

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

Observe que la columna b se devuelve como dynamic, mientras que c se devuelve como int.

Uso de with_itemindex

Expansión de una matriz con with_itemindex:

range x from 1 to 4 step 1
| summarize x = make_list(x)
| mv-expand with_itemindex=Index x

Salida

x Índice
1 0
2 1
3 2
4 3