Operador mv-expand
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
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.
Sintaxis
T |mv-expand
[kind=
(bag
array
| )] [with_itemindex=
IndexColumnName] ColumnName [to typeof(
Typename)
] [,
ColumnName ...] [limit
Rowlimit]
T [(bag
| array
)] [kind=
Name =
] ArrayExpression [to typeof(
Typename)
] [,
[Name =
] ArrayExpression [to typeof(
Typename)
] ...] [limit
Rowlimit]|mv-expand
Obtenga más información sobre las convenciones de sintaxis.
Parámetros
Nombre | Type | Obligatorio | 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 operador mv-expand . 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 se ajustan al 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:
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.
Para cada ColumnName o ArrayExpression expandido, el número de registros de salida se determina para cada valor, tal 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.
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
obagexpansion=bag
: Las bolsas de propiedades se expanden en bolsas de propiedades de entrada única. Este modo es el predeterminado.kind=array
obagexpansion=array
: los contenedores de propiedades se expanden en estructuras de matriz de valores]
clave,
de dos elementos[
, lo que permite el acceso uniforme a las claves y los 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 de contenedor a pares clave-valor
Una expansión de bolsa simple 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 |
Contenido relacionado
- Operador mv-apply.
- Para ver lo contrario del operador mv-expand, consulte summarize make_list().
- Para expandir objetos JSON dinámicos en columnas mediante claves de contenedor de propiedades, consulte bag_unpack().