Compartir a través de


Operador mv-apply

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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:

  1. Usa el mv-expand operador para expandir cada registro de la entrada en subtables (se conserva el orden).
  2. Aplica la subconsulta para cada una de las subtables.
  3. 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.
  4. Devuelve la unión de los resultados.

El mv-apply operador obtiene las siguientes entradas:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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:

limitRowLimit

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"
}