Share via


mv-apply, opérateur

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 possède une colonne Metric de type dynamic dont les valeurs sont des tableaux de real nombres. La requête suivante localise les deux plus grandes valeurs 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 de l’entrée dans des sous-tableaux (l’ordre est conservé).
  2. Applique la sous-requête pour chacune des sous-tables.
  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 s’évaluent en tableaux dynamiques à développer. Le nombre d’enregistrements dans chaque sous-tableau développé correspond à la longueur maximale de chacun de ces tableaux dynamiques. Les valeurs Null sont ajoutées lorsque plusieurs expressions sont spécifiées et que 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. Un nom aléatoire est utilisé dans le cas contraire.

    Notes

    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. Ceux-ci deviennent les types de colonnes des colonnes dans les sous-tables. En l'absence de spécification, dynamic est utilisé.

  4. Éventuellement, 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 abouti à 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 le premier, si la sous-requête inclut uniquement des projections).)

Syntax

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 :

[Nom=] ArrayExpression [totypeof(Typename)]

RowLimit est simplement :

limitRowLimit

et SubQuery a la même syntaxe que n’importe quelle instruction de requête.

Découvrez les conventions de syntaxe.

Paramètres

Nom Type Obligatoire Description
ItemIndex string Indique le nom d’une colonne de type long qui est ajoutée à l’entrée dans le cadre de la phase d’expansion du tableau et indique l’index de tableau de base 0 de la valeur développée.
Nom string Nom à attribuer aux valeurs développées par le tableau de chaque expression développée par le tableau. S’il n’est pas spécifié, le nom de la colonne est utilisé s’il est 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 le 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 que prennent 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. S’il n’est pas spécifié, 2147483647 est utilisé.
Sous-requête string Expression de requête tabulaire avec une source tabulaire implicite qui est appliquée à chaque sous-tableau étendu au tableau.

Notes

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 element
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 travailler avec 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 element
3 7
4 9
3 8
4 10

Utilisation de colonnes mutiple pour joindre un é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 interne mv-expand pour supprimer des 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 values
555-555-1234 555-555-1212 46 {
« SourceNumber » : « 555-555-1234 »,
« TargetNumber » : « 555-555-1212 »
}
555-555-1212     {
« SourceNumber » : « 555-555-1212 »
}