Operatore mv-apply
Si applica a: ✅Microsoft Fabric✅Azure Esplora dati✅ Azure Monitor✅Microsoft 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:
- Usa l'operatore
mv-expand
per espandere ogni record nell'input in tabelle secondarie (l'ordine viene mantenuto). - Applica la sottoquery per ognuna delle sottotabella.
- 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.
- Restituisce l'unione dei risultati.
L'operatore mv-apply
ottiene gli input seguenti:
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.
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.
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
.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.
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:
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 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" } |