mv-apply, opérateur
S’applique à : ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Applique une sous-requête à chaque enregistrement et retourne l’union des résultats de toutes les sous-requêtes.
Par exemple, supposons qu’une table T
a une colonne Metric
de type dynamic
dont les valeurs sont des tableaux de real
nombres. La requête suivante recherche les deux valeurs les plus importantes dans chaque Metric
valeur et retourne les enregistrements correspondant à ces valeurs.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
L’opérateur mv-apply
a les étapes de traitement suivantes :
- Utilise l’opérateur
mv-expand
pour développer chaque enregistrement dans les sous-tables (l’ordre est conservé). - Applique la sous-requête pour chacun des sous-tableaux.
- Ajoute zéro ou plusieurs colonnes à la sous-table résultante. Ces colonnes contiennent les valeurs des colonnes sources qui ne sont pas développées et sont répétées si nécessaire.
- Retourne l’union des résultats.
L’opérateur mv-apply
obtient les entrées suivantes :
Une ou plusieurs expressions qui sont évaluées dans des tableaux dynamiques à développer. Le nombre d’enregistrements dans chaque sous-table développée est la longueur maximale de chacun de ces tableaux dynamiques. Les valeurs Null sont ajoutées où plusieurs expressions sont spécifiées et les tableaux correspondants ont des longueurs différentes.
Si vous le souhaitez, les noms à attribuer aux valeurs des expressions après l’expansion. Ces noms deviennent les noms de colonnes dans les sous-tables. S’il n’est pas spécifié, le nom d’origine de la colonne est utilisé lorsque l’expression est une référence de colonne. Dans le cas contraire, un nom aléatoire est utilisé.
Remarque
Il est recommandé d’utiliser les noms de colonnes par défaut.
Types de données des éléments de ces tableaux dynamiques, après l’expansion. Ils deviennent les types de colonnes des colonnes dans les sous-tables. En l'absence de spécification,
dynamic
est utilisé.Si vous le souhaitez, le nom d’une colonne à ajouter aux sous-tables qui spécifie l’index de base 0 de l’élément dans le tableau qui a entraîné l’enregistrement de sous-table.
Si vous le souhaitez, le nombre maximal d’éléments de tableau à développer.
L’opérateur mv-apply
peut être considéré comme une généralisation de l’opérateur mv-expand
(en fait, ce dernier peut être implémenté par l’ancien, si la sous-requête inclut uniquement des projections.)
Syntaxe
T |
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery )
Où ItemIndex a la syntaxe :
with_itemindex
=
IndexColumnName
ColumnsToExpand est une liste séparée par des virgules d’un ou plusieurs éléments du formulaire :
[Name =
] ArrayExpression [to
typeof
(
Typename])
RowLimit est simplement :
limit
RowLimit
et SubQuery a la même syntaxe que n’importe quelle instruction de requête.
En savoir plus sur les conventions de syntaxe.
Paramètres
Nom | Type | Requise | Description |
---|---|---|---|
ItemIndex | string |
Indique le nom d’une colonne de type long ajoutée à l’entrée dans le cadre de la phase d’expansion du tableau et indique l’index de tableau basé sur 0 de la valeur développée. |
|
Nom | string |
Nom permettant d’affecter les valeurs étendues au tableau de chaque expression développée par tableau. S’il n’est pas spécifié, le nom de la colonne est utilisé si disponible. Un nom aléatoire est généré si ArrayExpression n’est pas un nom de colonne simple. | |
ArrayExpression | dynamic |
✔️ | Tableau dont les valeurs sont développées par tableau. Si l’expression est le nom d’une colonne dans l’entrée, la colonne d’entrée est supprimée de l’entrée et une nouvelle colonne du même nom, ou ColumnName si elle est spécifiée, apparaît dans la sortie. |
Typename | string |
Nom du type pris par les éléments individuels du dynamic tableau ArrayExpression . Les éléments qui ne sont pas conformes à ce type sont remplacés par une valeur Null. S’il n’est pas spécifié, dynamic est utilisé par défaut. |
|
RowLimit | int |
Limite du nombre d’enregistrements à générer à partir de chaque enregistrement de l’entrée. Si elle n’est pas spécifiée, 2147483647 est utilisée. | |
Sous-requête | string |
Expression de requête tabulaire avec une source tabulaire implicite qui est appliquée à chaque sous-table développée par tableau. |
Remarque
Contrairement à l’opérateur mv-expand
, l’opérateur mv-apply
ne prend pas en charge bagexpand=array
l’expansion. Si l’expression à développer est un conteneur de propriétés et non un tableau, vous pouvez utiliser un opérateur interne mv-expand
(voir l’exemple ci-dessous).
Exemples
Obtention du plus grand élément à partir du tableau
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
)
Sortie
xMod2 |
l | élément |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Calcul de la somme des deux plus grands éléments d’un tableau
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)
)
Sortie
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
Sélectionner des éléments dans des tableaux
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)
)
Sortie
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] |
Utilisation with_itemindex
pour l’utilisation d’un sous-ensemble du tableau
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
Sortie
index | élément |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
Utilisation de colonnes mutiple pour joindre l’élément de 2 tableaux
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)
)
Sortie
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"] |
Application de mv-apply à un conteneur de propriétés
Dans l’exemple suivant, mv-apply
est utilisé en combinaison avec un élément interne mv-expand
pour supprimer les valeurs qui ne commencent pas par « 555 » d’un conteneur de propriétés :
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
Sortie
SourceNumber | TargetNumber | CharsCount | . |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { « SourceNumber » : « 555-555-1234 », « TargetNumber » : « 555-555-1212 » } |
555-555-1212 | { « SourceNumber » : « 555-555-1212 » } |