Partager via


mv-expand operator

Applies to: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Développe des tableaux dynamiques à valeurs multiples ou des conteneurs de propriétés en plusieurs enregistrements.

mv-expand can be described as the opposite of the aggregation operators that pack multiple values into a single dynamic-typed array or property bag, such as summarize ... make-list() and make-series. Chaque élément dans le tableau (scalaire) ou le conteneur de propriétés génère un nouvel enregistrement dans la sortie de l’opérateur. Toutes les colonnes de l’entrée qui ne sont pas développées sont dupliquées dans tous les enregistrements de la sortie.

Syntax

T|mv-expand [kind=(bag | array)] [with_itemindex=IndexColumnName] ColumnName [to typeof(Typename)] [,ColumnName ...] [limitRowlimit]

T|mv-expand [kind=(bag | array)] [Name=] ArrayExpression [to typeof(Typename)] [, [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]

Learn more about syntax conventions.

Parameters

Name Type Required Description
ColumnName, ArrayExpression string ✔️ Référence de colonne ou expression scalaire avec une valeur de type dynamic qui contient un tableau ou un conteneur de propriétés. Les éléments individuels de plus haut niveau du tableau ou du conteneur de propriétés sont développés en plusieurs enregistrements.
When ArrayExpression is used and Name doesn't equal any input column name, the expanded value is extended into a new column in the output. Otherwise, the existing ColumnName is replaced.
Name string Nom de la nouvelle colonne.
Typename string ✔️ Indique le type sous-jacent des éléments du tableau, qui devient le type de la colonne produite par l’opérateur mv-expand. L’opération d’application de type est uniquement cast et n’inclut pas d’analyse ou de conversion de type. Les éléments de tableau qui ne sont pas conformes au type déclaré deviennent des null valeurs.
RowLimit int Nombre maximal de lignes générées à partir de chaque ligne d’origine. La valeur par défaut est 2147483647. mvexpand est une forme héritée et obsolète de l’opérateur mv-expand. La version héritée a une limite de lignes par défaut de 128.
IndexColumnName string If with_itemindex is specified, the output includes another column named IndexColumnName that contains the index starting at 0 of the item in the original expanded collection.

Returns

Pour chaque enregistrement de l’entrée, l’opérateur retourne zéro, un ou plusieurs enregistrements dans la sortie, comme déterminé de la façon suivante :

  1. Les colonnes d’entrée qui ne sont pas développées apparaissent dans la sortie avec leur valeur d’origine. Si un seul enregistrement d’entrée est développé en plusieurs enregistrements de sortie, la valeur est dupliquée dans tous les enregistrements.

  2. For each ColumnName or ArrayExpression that is expanded, the number of output records is determined for each value as explained in modes of expansion. Pour chaque enregistrement d’entrée, le nombre maximal d’enregistrements de sortie est calculé. Tous les tableaux ou conteneurs de propriétés sont développés « en parallèle » afin que les valeurs manquantes (le cas échéant) soient remplacées par des valeurs Null. Les éléments sont développés en lignes dans l’ordre dans lequel ils apparaissent dans le tableau/conteneur d’origine.

  3. Si la valeur dynamique est Null, un seul enregistrement est produit pour cette valeur (Null). Si la valeur dynamique est un tableau ou un conteneur de propriétés vide, aucun enregistrement n’est produit pour cette valeur. Sinon, il est produit autant d’enregistrements qu’il y a d’éléments dans la valeur dynamique.

Les colonnes développées sont de type dynamic, sauf si elles sont typées explicitement avec la clause to typeof().

Modes d’expansion

Deux modes d’expansion de conteneur de propriétés sont pris en charge :

  • kind=bag ou bagexpansion=bag: Les sacs de propriétés sont développés en sacs de propriétés à entrée unique. Il s'agit du mode par défaut.
  • kind=array or bagexpansion=array: Property bags are expanded into two-element [key,value] array structures, allowing uniform access to keys and values. Ce mode permet aussi par exemple d’effectuer une agrégation avec comptage distinct sur les noms de propriété.

Examples

The examples in this article use publicly available tables in the help cluster, such as the StormEvents table in the Samples database.

The examples in this article use publicly available tables, such as the Weather table in the Weather analytics sample gallery. Vous devrez peut-être modifier le nom de la table dans l’exemple de requête pour qu’elle corresponde à la table de votre espace de travail.

Les exemples de cette section montrent comment utiliser la syntaxe pour vous aider à commencer.

Colonne unique - extension de tableau

datatable (a: int, b: dynamic)
[
    1, dynamic([10, 20]),
    2, dynamic(['a', 'b'])
]
| mv-expand b

Output

a b
1 10
1 20
2 a
2 b

Colonne unique - extension de sac

Développement simple d’une colonne unique :

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b

Output

a b
1 {"prop1": "a1"}
1 {"prop2": "b1"}
2 {"prop1": "a2"}
2 {"prop2": "b2"}

Colonne unique : extension de conteneur en paires clé-valeur

Extension de sac simple aux paires clé-valeur :

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand kind=array b 
| extend key = b[0], val=b[1]

Output

a b key val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

Deux colonnes zippées

Développez d’abord deux colonnes « zip » les colonnes applicables, puis développez-les :

datatable (a: int, b: dynamic, c: dynamic)[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 4, 3])
]
| mv-expand b, c

Output

a b c
1 {"prop1":"a"} 5
1 {"prop2":"b"} 4
1 3

Produit cartésien de deux colonnes

Si vous souhaitez obtenir un produit cartésien du développement de deux colonnes, développez l’une après l’autre :

datatable (a: int, b: dynamic, c: dynamic)
[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 6])
]
| mv-expand b
| mv-expand c

Output

a b c
1 { "prop1": "a"} 5
1 { "prop1": "a"} 6
1 { "prop2": "b"} 5
1 { "prop2": "b"} 6

Convert output

Pour forcer la sortie d’un opérateur mv-expand avec un certain type (le type par défaut est « dynamic »), utilisez to typeof :

datatable (a: string, b: dynamic, c: dynamic)[
    "Constant", dynamic([1, 2, 3, 4]), dynamic([6, 7, 8, 9])
]
| mv-expand b, c to typeof(int)
| getschema 

Output

ColumnName ColumnOrdinal DateType ColumnType
a 0 System.String string
b 1 System.Object dynamic
c 2 System.Int32 int

Notez que la colonne b est retournée avec le type dynamic, tandis que c est retournée avec le type int.

Using with_itemindex

Développement d’un tableau avec with_itemindex :

range x from 1 to 4 step 1
| summarize x = make_list(x)
| mv-expand with_itemindex=Index x

Output

x Index
1 0
2 1
3 2
4 3