Condividi tramite


Operatore mv-apply

Si applica a: ✅Microsoft Fabric

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 [totypeof(Typename])

RowLimit è semplicemente:

limit RowLimit

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 mv-apply l'espansionebagexpand=array. 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

Esaminare gli esempi ed eseguirli nella pagina query di Esplora dati.

Recupero dell'elemento più grande dalla matrice

La query restituisce il numero pari più piccolo (2) e il numero dispari più piccolo (1).

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

La query restituisce la somma dei primi 2 numeri pari (6 + 8 = 14) e la somma dei primi 2 numeri dispari (5 + 7 = 12).

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

La query identifica i primi 2 elementi di ogni matrice dinamica in base ai valori Arr2 e li riepiloga in nuovi elenchi.

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

La query restituisce una tabella con righe in cui l'indice è 3 o superiore, inclusi i valori dell'indice e degli elementi degli elenchi originali di numeri pari e dispari.

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

La query combina gli elementi di due matrici dinamiche in un nuovo formato concatenato e quindi li riepiloga in elenchi.

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à

Questa query rimuove in modo dinamico le proprietà dall'oggetto valori compressi in base ai criteri che i relativi valori non iniziano con "555". Il risultato finale contiene le colonne originali con proprietà indesiderate rimosse.

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