Share via


operador mv-apply

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

Por exemplo, suponha que uma tabela T tem uma coluna Metric do tipo dynamic cujos valores são matrizes de real números. A consulta seguinte localiza os dois maiores valores em cada Metric valor e devolve os registos correspondentes a estes valores.

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

O mv-apply operador tem os seguintes passos de processamento:

  1. Utiliza o mv-expand operador para expandir cada registo na entrada em sub-tabelas (a ordem é preservada).
  2. Aplica a subconsulta para cada uma das sub-tabelas.
  3. Adiciona zero ou mais colunas à subtalho resultante. Estas colunas contêm os valores das colunas de origem que não estão expandidas e são repetidas sempre que necessário.
  4. Devolve 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 a expandir. O número de registos em cada subtalho expandido é o comprimento máximo de cada uma dessas matrizes dinâmicas. São adicionados valores nulos onde são especificadas múltiplas expressões e as matrizes correspondentes têm comprimentos diferentes.

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

    Nota

    Recomenda-se que utilize os nomes de coluna predefinidos.

  3. Os tipos de dados dos elementos dessas matrizes dinâmicas, após a expansão. Estes tornam-se os tipos de coluna das colunas nas sub-tabelas. Se não for especificado, dynamic será utilizado.

  4. Opcionalmente, o nome de uma coluna a adicionar às sub-tabelas que especifica o índice baseado em 0 do elemento na matriz que resultou no registo subtável.

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

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

Syntax

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

Em que ItemIndex tem a sintaxe:

with_itemindex=IndexColumnName

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

[Nome=] ArrayExpression [totypeof(Typename)]

RowLimit é simplesmente:

limitLinhaLimitar

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

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
ItemIndex string Indica o nome de uma coluna do tipo long que é anexada à 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 pela matriz de cada expressão expandida por matriz. Se não for especificado, o nome da coluna será utilizado, se disponível. É gerado um nome aleatório se ArrayExpression não for um nome de coluna simples.
MatrizExpressão dynamic ✔️ A matriz cujos valores são expandidos pela matriz. Se a expressão for o nome de uma coluna na entrada, a coluna de entrada é removida da entrada e é apresentada uma nova coluna com o mesmo nome ou ColumnName , se especificado, na saída.
Nomedotilizador string O nome do tipo que os elementos individuais da dynamic matriz ArrayExpression assumem. Os elementos que não estão em conformidade com este tipo são substituídos por um valor nulo. Se não for especificado, dynamic é utilizado por predefinição.
LinhaLimitar int Um limite do número de registos a gerar a partir de cada registo da entrada. Se não for especificado, é utilizado 2147483647.
Subconsulta string Uma expressão de consulta tabular com uma origem tabular implícita que é aplicada a cada subtable expandida por matriz.

Nota

Ao contrário do mv-expand operador, o mv-apply operador não suporta bagexpand=array a expansão. Se a expressão a expandir for um conjunto de propriedades e não uma matriz, pode utilizar um operador interno mv-expand (veja o exemplo abaixo).

Exemplos

Obter o elemento maior 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 elemento
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

Calcular a soma dos dois maiores elementos numa 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 SumOfTop2
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]

Utilizar 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 elemento
3 7
4 9
3 8
4 10

Utilizar colunas mutiple para associar o elemento 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"]

Aplicar mv-apply a um saco de propriedades

No exemplo seguinte, mv-apply é utilizado em combinação com um interior mv-expand para remover valores que não começam com "555" de um saco 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

SourceNumber Número de Destino CharsCount values
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}