Operador mv-apply
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Aplica una subconsulta a cada registro y devuelve la unión de los resultados de todas las subconsultas.
Por ejemplo, supongamos que una tabla T
tiene una columna Metric
de tipo dynamic
cuyos valores son matrices de real
números. La consulta siguiente busca los dos valores más grandes de cada Metric
valor y devuelve los registros correspondientes a estos valores.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
El mv-apply
operador tiene los siguientes pasos de procesamiento:
- Usa el
mv-expand
operador para expandir cada registro de la entrada en subtables (se conserva el orden). - Aplica la subconsulta para cada una de las subtables.
- Agrega cero o más columnas a la subtable resultante. Estas columnas contienen los valores de las columnas de origen que no se expanden y se repiten cuando sea necesario.
- Devuelve la unión de los resultados.
El mv-apply
operador obtiene las siguientes entradas:
Una o varias expresiones que se evalúan en matrices dinámicas que se van a expandir. El número de registros de cada subtable expandido es la longitud máxima de cada una de esas matrices dinámicas. Se agregan valores NULL donde se especifican varias expresiones y las matrices correspondientes tienen longitudes diferentes.
Opcionalmente, los nombres para asignar los valores de las expresiones después de la expansión. Estos nombres se convierten en los nombres de columnas de las subtables. Si no se especifica, se usa el nombre original de la columna cuando la expresión es una referencia de columna. De lo contrario, se usa un nombre aleatorio.
Nota:
Se recomienda usar los nombres de columna predeterminados.
Los tipos de datos de los elementos de esas matrices dinámicas, después de la expansión. Se convierten en los tipos de columna de las columnas de las subtables. Si no se especifica, se utiliza
dynamic
.Opcionalmente, el nombre de una columna que se va a agregar a las subtables que especifica el índice basado en 0 del elemento de la matriz que dio lugar al registro subtable.
Opcionalmente, el número máximo de elementos de matriz que se van a expandir.
El mv-apply
operador puede considerarse como una generalización del mv-expand
operador (de hecho, el segundo puede implementarse por el primero, si la subconsulta solo incluye proyecciones).
Sintaxis
T |
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery )
Donde ItemIndex tiene la sintaxis:
with_itemindex
=
IndexColumnName
ColumnsToExpand es una lista separada por comas de uno o varios elementos del formulario:
[Name =
] ArrayExpression [to
typeof
(
Typename])
RowLimit es simplemente:
limit
RowLimit
y SubQuery tienen la misma sintaxis de cualquier instrucción de consulta.
Obtenga más información sobre las convenciones de sintaxis.
Parámetros
Nombre | Type | Obligatorio | Descripción |
---|---|---|---|
ItemIndex | string |
Indica el nombre de una columna de tipo long que se anexa a la entrada como parte de la fase de expansión de matriz e indica el índice de matriz basado en 0 del valor expandido. |
|
Nombre | string |
Nombre para asignar los valores expandidos por la matriz de cada expresión expandida por matriz. Si no se especifica, se usa el nombre de la columna si está disponible. Se genera un nombre aleatorio si ArrayExpression no es un nombre de columna simple. | |
ArrayExpression | dynamic |
✔️ | Matriz cuyos valores se expanden por matriz. Si la expresión es el nombre de una columna de la entrada, la columna de entrada se quita de la entrada y una nueva columna del mismo nombre, o ColumnName si se especifica, aparece en la salida. |
Typename | string |
Nombre del tipo que toman los elementos individuales de la dynamic matriz ArrayExpression . Los elementos que no se ajustan a este tipo se reemplazan por un valor NULL. Si no se especifica, dynamic se usa de forma predeterminada. |
|
RowLimit | int |
Límite del número de registros que se van a generar a partir de cada registro de la entrada. Si no se especifica, se usa 2147483647. | |
SubQuery | string |
Expresión de consulta tabular con un origen tabular implícito que se aplica a cada subtable expandida por matriz. |
Nota:
A diferencia del mv-expand
operador , el mv-apply
operador no admite bagexpand=array
la expansión. Si la expresión que se va a expandir es un contenedor de propiedades y no una matriz, puede usar un operador interno mv-expand
(consulte el ejemplo siguiente).
Ejemplos
Obtención del elemento más grande de la matriz
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply element=l to typeof(long) on
(
top 1 by element
)
Salida
xMod2 |
l | element |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Calcular la suma de los dos elementos más grandes de una matriz
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply l to typeof(long) on
(
top 2 by l
| summarize SumOfTop2=sum(l)
)
Salida
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
Selección de elementos en matrices
datatable (Val:int, Arr1:dynamic, Arr2:dynamic)
[ 1, dynamic(['A1', 'A2', 'A3']), dynamic([10, 30, 7]),
7, dynamic(['B1', 'B2', 'B5']), dynamic([15, 11, 50]),
3, dynamic(['C1', 'C2', 'C3', 'C4']), dynamic([6, 40, 20, 8])
]
| mv-apply NewArr1=Arr1, NewArr2=Arr2 to typeof(long) on (
top 2 by NewArr2
| summarize NewArr1=make_list(NewArr1), NewArr2=make_list(NewArr2)
)
Salida
Val1 | Arr1 | Arr2 | NewArr1 |
NewArr2 |
---|---|---|---|---|
1 | ["A1","A2","A3"] | [10,30,7] | ["A2',"A1"] | [30,10] |
7 | ["B1","B2","B5"] | [15,11,50] | ["B5","B1"] | [50,15] |
3 | ["C1","C2","C3","C4"] | [6,40,20,8] | ["C2","C3"] | [40,20] |
Uso with_itemindex
para trabajar con un subconjunto de la matriz
let _data =
range x from 1 to 10 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply with_itemindex=index element=l to typeof(long) on
(
// here you have 'index' column
where index >= 3
)
| project index, element
Salida
índice | element |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
Uso de columnas mutiple para combinar el elemento de 2 matrices
datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
1, dynamic(['A1', 'A2', 'A3']), dynamic(['B1', 'B2', 'B3']),
5, dynamic(['C1', 'C2']), dynamic(['D1', 'D2'])
]
| mv-apply Arr1, Arr2 on (
extend Out = strcat(Arr1, "_", Arr2)
| summarize Arr1 = make_list(Arr1), Arr2 = make_list(Arr2), Out= make_list(Out)
)
Salida
Val | Arr1 | Arr2 | Out |
---|---|---|---|
1 | ["A1","A2","A3"] | ["B1","B2","B3"] | ["A1_B1","A2_B2","A3_B3"] |
5 | ["C1","C2"] | ["D1","D2"] | ["C1_D1","C2_D2"] |
Aplicar mv-apply a un contenedor de propiedades
En el ejemplo siguiente, mv-apply
se usa en combinación con un elemento interno mv-expand
para quitar valores que no comienzan por "555" de un contenedor de propiedades:
datatable(SourceNumber: string, TargetNumber: string, CharsCount: long)
[
'555-555-1234', '555-555-1212', 46,
'555-555-1212', '', int(null)
]
| extend values = pack_all()
| mv-apply removeProperties = values on
(
mv-expand kind = array values
| where values[1] !startswith "555"
| summarize propsToRemove = make_set(values[0])
)
| extend values = bag_remove_keys(values, propsToRemove)
| project-away propsToRemove
Salida
SourceNumber | TargetNumber | CharsCount | valores |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { "SourceNumber": "555-555-1234", "TargetNumber": "555-555-1212" } |
555-555-1212 | { "SourceNumber": "555-555-1212" } |