Condividi tramite


Operatore mv-apply

Si applica a: ✅Microsoft Fabric✅Azure Esplora dati Azure MonitorMicrosoft Sentinel

Applica una sottoquery a ogni record e restituisce l'unione dei risultati di tutte le sottoquery.

Si supponga, ad esempio, che una tabella T abbia una colonna Metric di tipo dynamic i cui valori sono matrici di real numeri. La query seguente individua i due valori più grandi in ogni Metric valore e restituisce i record corrispondenti a questi valori.

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

L'operatore mv-apply prevede i passaggi di elaborazione seguenti:

  1. Usa l'operatore mv-expand per espandere ogni record nell'input in tabelle secondarie (l'ordine viene mantenuto).
  2. Applica la sottoquery per ognuna delle sottotabella.
  3. Aggiunge zero o più colonne alla tabella secondaria risultante. Queste colonne contengono i valori delle colonne di origine che non sono espanse e vengono ripetute se necessario.
  4. Restituisce l'unione dei risultati.

L'operatore mv-apply ottiene gli input seguenti:

  1. Una o più espressioni che restituiscono matrici dinamiche da espandere. Il numero di record in ogni tabella secondaria espansa è la lunghezza massima di ognuna di queste matrici dinamiche. Vengono aggiunti valori Null in cui vengono specificate più espressioni e le matrici corrispondenti hanno lunghezze diverse.

  2. Facoltativamente, i nomi da assegnare ai valori delle espressioni dopo l'espansione. Questi nomi diventano i nomi delle colonne nelle tabelle secondarie. Se non specificato, il nome originale della colonna viene usato quando l'espressione è un riferimento a una colonna. In caso contrario, viene usato un nome casuale.

    Nota

    È consigliabile usare i nomi di colonna predefiniti.

  3. Tipi di dati degli elementi di tali matrici dinamiche, dopo l'espansione. Questi diventano i tipi di colonna delle colonne nelle tabelle secondarie. Se omesso, viene utilizzato dynamic.

  4. Facoltativamente, il nome di una colonna da aggiungere alle sottotable che specifica l'indice in base 0 dell'elemento nella matrice che ha generato il record sottotabella.

  5. Facoltativamente, il numero massimo di elementi della matrice da espandere.

L'operatore mv-apply può essere considerato come una generalizzazione dell'operatore mv-expand (in realtà, quest'ultimo può essere implementato dal primo, se la sottoquery include solo proiezioni).

Sintassi

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

Dove ItemIndex ha la sintassi:

with_itemindex= IndexColumnName

ColumnsToExpand è un elenco delimitato da virgole di uno o più elementi del form:

[Name =] ArrayExpression [to typeof(Typename])

RowLimit è semplicemente:

limitRowLimit

e SubQuery hanno la stessa sintassi di qualsiasi istruzione di query.

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Digita Obbligatorio Descrizione
ItemIndex string Indica il nome di una colonna di tipo long aggiunta all'input come parte della fase di espansione della matrice e indica l'indice di matrice in base 0 del valore espanso.
Nome string Nome per assegnare i valori espansi dalla matrice di ogni espressione espansa dalla matrice. Se non specificato, il nome della colonna viene utilizzato, se disponibile. Se ArrayExpression non è un nome di colonna semplice, viene generato un nome casuale.
ArrayExpression dynamic ✔️ Matrice i cui valori sono espansi dalla matrice. Se l'espressione è il nome di una colonna nell'input, la colonna di input viene rimossa dall'input e una nuova colonna con lo stesso nome o ColumnName , se specificata, viene visualizzata nell'output.
Nometipo string Nome del tipo che accettano i singoli elementi della dynamic matrice ArrayExpression . Gli elementi che non sono conformi a questo tipo vengono sostituiti da un valore Null. Se non specificato, dynamic viene utilizzato per impostazione predefinita.
RowLimit int Limite al numero di record da generare da ogni record dell'input. Se non specificato, viene usato 2147483647.
SottoQuery string Espressione di query tabulare con un'origine tabulare implicita applicata a ogni sottotabella espansa con matrice.

Nota

A differenza dell'operatore, l'operatore mv-expand non supporta bagexpand=array l'espansionemv-apply. Se l'espressione da espandere è un contenitore delle proprietà e non una matrice, è possibile usare un operatore interno mv-expand (vedere l'esempio seguente).

Esempi

Recupero dell'elemento più grande dalla matrice

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
    )

Output

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

Calcolo della somma dei due elementi più grandi in una matrice

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

Output

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

Selezionare gli elementi nelle matrici

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

Output

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 di per l'uso di un subset della matrice

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

Output

index element
3 7
4 9
3 8
4 10

Uso di colonne mutiple per unire l'elemento di 2 matrici

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

Output

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

Applicazione di mv-apply a un contenitore di proprietà

Nell'esempio seguente viene mv-apply usato in combinazione con un interno mv-expand per rimuovere i valori che non iniziano con "555" da un contenitore delle proprietà:

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

Output

SourceNumber TargetNumber CharsCount valori
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}