Compartilhar via


operador mv-apply

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Aplica uma subconsulta a cada registro e retorna a união dos resultados de todas as subconsultas.

Por exemplo, suponha que uma tabela T tenha uma coluna Metric do tipo dynamic cujos valores são matrizes de real números. A consulta a seguir localiza os dois maiores valores em cada Metric valor e retorna os registros correspondentes a esses valores.

T | mv-apply Metric to typeof(real) on 
(
   top 2 by Metric desc
)

O mv-apply operador tem as seguintes etapas de processamento:

  1. Usa o mv-expand operador para expandir cada registro na entrada em subtabelas (a ordem é preservada).
  2. Aplica a subconsulta para cada uma das subtabelas.
  3. Adiciona zero ou mais colunas à subtabela resultante. Essas colunas contêm os valores das colunas de origem que não são expandidas e são repetidas quando necessário.
  4. Retorna a união dos resultados.

O mv-apply operador obtém as seguintes entradas:

  1. Uma ou mais expressões que são avaliadas em matrizes dinâmicas para expandir. O número de registros em cada subtabela expandida é o comprimento máximo de cada uma dessas matrizes dinâmicas. Valores nulos são adicionados onde várias expressões são especificadas e as matrizes correspondentes têm comprimentos diferentes.

  2. Opcionalmente, os nomes para atribuir os valores das expressões após a expansão. Esses nomes se tornam os nomes das colunas nas subtabelas. Se não for especificado, o nome original da coluna será usado quando a expressão for uma referência de coluna. Caso contrário, um nome aleatório é usado.

    Observação

    Recomenda-se usar os nomes de coluna padrão.

  3. Os tipos de dados dos elementos dessas matrizes dinâmicas, após a expansão. Eles se tornam os tipos de coluna das colunas nas subtabelas. Se não for especificado, é usado dynamic.

  4. Opcionalmente, o nome de uma coluna a ser adicionada às subtabelas que especifica o índice baseado em 0 do elemento na matriz que resultou no registro da subtabela.

  5. Opcionalmente, o número máximo de elementos de matriz a serem expandidos.

O mv-apply operador pode ser pensado como uma generalização do mv-expand operador (na verdade, o último pode ser implementado pelo primeiro, se a subconsulta incluir apenas projeções).

Sintaxe

T | mv-apply [ItemIndex] ColumnsToExpand [RowLimit] ( on SubQuery )

Onde ItemIndex tem a sintaxe:

with_itemindex= IndexColumnName

ColumnsToExpand é uma lista separada por vírgulas de um ou mais elementos do formulário:

[Nome=] ArrayExpression [ (typeofto Typename])

RowLimit é simplesmente:

limitLimite de linha

e SubQuery tem a mesma sintaxe de qualquer instrução de consulta.

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória Descrição
Índice de itens string Indica o nome de uma coluna do tipo long que é acrescentada à entrada como parte da fase de expansão da matriz e indica o índice de matriz baseado em 0 do valor expandido.
Nome string O nome para atribuir os valores expandidos de matriz de cada expressão expandida de matriz. Se não for especificado, o nome da coluna será usado, se disponível. Um nome aleatório será gerado se ArrayExpression não for um nome de coluna simples.
Expressão de matriz dynamic ✔️ A matriz cujos valores são expandidos por matriz. Se a expressão for o nome de uma coluna na entrada, a coluna de entrada será removida da entrada e uma nova coluna com o mesmo nome, ou ColumnName , se especificado, aparecerá na saída.
Nome do tipo string O nome do tipo que os elementos individuais da dynamic matriz ArrayExpression usam. Os elementos que não estão em conformidade com esse tipo são substituídos por um valor nulo. Se não for especificado, dynamic é usado por padrão.
Limite de linha int Um limite no número de registros a serem gerados a partir de cada registro da entrada. Se não for especificado, 2147483647 é usado.
Subconsulta string Uma expressão de consulta tabular com uma fonte tabular implícita que é aplicada a cada subtabela expandida por matriz.

Observação

Ao contrário do mv-expand operador, o mv-apply operador não dá suporte à bagexpand=array expansão. Se a expressão a ser expandida for um recipiente de propriedades e não uma matriz, você poderá usar um operador interno mv-expand (veja o exemplo abaixo).

Exemplos

Obtendo o maior elemento da 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
    )

Saída

xMod2 l element
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

Calculando a soma dos dois maiores elementos em uma 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)
    )

Saída

xMod2 l Soma do Top2
1 [1,3,5,7] 12
0 [2,4,6,8] 14

Selecionar elementos em matrizes

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)
)

Saída

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]

Usando with_itemindex para trabalhar com um subconjunto da 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

Saída

índice element
3 7
4 9
3 8
4 10

Usando várias colunas para unir elementos de 2 matrizes

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)
    )

Saída

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

Aplicando mv-apply a um recipiente de propriedades

No exemplo a seguir, mv-apply é usado em combinação com um interno mv-expand para remover valores que não começam com "555" de um recipiente de propriedades:

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

Saída

Número de origem Número do alvo Contagem de caracteres valores
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"Número_alvo": "555-555-1212"
}
555-555-1212     {
"Número da fonte": "555-555-1212"
}