Condividi tramite


Operatore mv-apply

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 vengono espanse e vengono ripetute quando 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 sottotabella 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 utilizzato 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 sottotabella. 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 della 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 modulo:

[Nome=] ArrayExpression [totypeof(Typename)]

RowLimit è semplicemente:

limitRowLimit

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

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria 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 della 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. Viene generato un nome casuale se ArrayExpression non è un nome di colonna semplice.
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 specificato, viene visualizzata nell'output.
Typename string Nome del tipo che accettano i singoli elementi della dynamic matrice ArrayExpression . Gli elementi non 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 utilizzato 2147483647.
Sottoquery string Espressione di query tabulare con un'origine tabulare implicita che viene applicata a ogni sottotabella espansa dalla matrice.

Nota

Diversamente dall'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).

Esempio

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 delle 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 delle proprietà

Nell'esempio seguente viene mv-apply usato in combinazione con un elemento interno mv-expand per rimuovere 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"
}