operador mv-apply
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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:
- Usa o
mv-expand
operador para expandir cada registro na entrada em subtabelas (a ordem é preservada). - Aplica a subconsulta para cada uma das subtabelas.
- 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.
- Retorna a união dos resultados.
O mv-apply
operador obtém as seguintes entradas:
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.
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.
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
.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.
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 [ (
typeof
to
Typename])
RowLimit é simplesmente:
limit
Limite 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" } |