Partager via


mv-apply, opérateur

S’applique à : ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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 :

  1. Utilise l’opérateur mv-expand pour développer chaque enregistrement dans les sous-tables (l’ordre est conservé).
  2. Applique la sous-requête pour chacun des sous-tableaux.
  3. 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.
  4. Retourne l’union des résultats.

L’opérateur mv-apply obtient les entrées suivantes :

  1. 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.

  2. 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.

  3. 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é.

  4. 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.

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

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 :

limitRowLimit

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