mv-expand-Operator

Erweitert dynamische Arrays oder Eigenschaftenbehälter mit mehreren Werten auf mehrere Datensätze.

mv-expand kann als Gegenteil der Aggregationsoperatoren beschrieben werden, die mehrere Werte in einem einzelnen Array oder Eigenschaftenbehälter des Typs dynamisch packen, z. B. summarize ... make-list() und make-series. Jedes Element im (skalaren) Array oder Eigenschaftenbehälter generiert einen neuen Datensatz in der Ausgabe des Operators. Alle nicht erweiterten Spalten der Eingabe werden in alle Datensätze in der Ausgabe dupliziert.

Syntax

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

T| mv-expand [bagexpansion=(bagarray | )] Name=ArrayExpression [to typeof(Typename)] [; [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]

Argumente

  • ColumnName, ArrayExpression: Ein Spaltenverweis oder ein skalarer Ausdruck mit einem Wert vom Typ dynamic, der ein Array oder einen Eigenschaftenbehälter enthält. Die einzelnen Elemente der obersten Ebene des Arrays oder Eigenschaftenbehälters werden auf mehrere Datensätze erweitert.
    Wenn ArrayExpression verwendet wird und Name keinem Eingabespaltennamen entspricht, wird der erweiterte Wert auf eine neue Spalte in der Ausgabe erweitert. Andernfalls wird der vorhandene ColumnName-Wert ersetzt.

  • Name: Ein Name für die neue Spalte.

  • Typname: Gibt den zugrunde liegenden Typ der Elemente des Arrays an, der zum Typ der Spalte wird, die vom mv-expand-Operator generiert wird. Der Vorgang zum Anwenden des Typs ist nur Umwandlung und umfasst keine Analyse oder Typkonvertierung. Arrayelemente, die nicht mit dem deklarierten Typ übereinstimmen, werden zu null-Werten.

  • RowLimit: Die maximale Anzahl von Zeilen, die aus jeder ursprünglichen Zeile generiert werden. Der Standardwert ist 2147483647.

    Hinweis

    mvexpand ist eine Legacy- und veraltete Form des Operators mv-expand. Die Legacyversion weist ein Standardzeilenlimit von 128 auf.

  • IndexColumnName: Wenn with_itemindex angegeben wird, enthält die Ausgabe eine weitere Spalte (mit dem Namen IndexColumnName), die den Index (beginnend bei 0) des Elements in der ursprünglichen erweiterten Sammlung enthält.

Gibt zurück

Der Operator gibt für jeden Datensatz in der Eingabe null, einen oder mehrere Datensätze in der Ausgabe zurück, wie auf folgende Weise festgelegt:

  1. Nicht erweiterte Eingabespalten werden in der Ausgabe mit ihrem ursprünglichen Wert angezeigt. Wird ein einzelner Eingabedatensatz auf mehrere Ausgabedatensätze erweitert, wird der Wert in alle Datensätze dupliziert.

  2. Für jeden erweiterten ColumnName- oder ArrayExpression-Wert wird die Anzahl von Ausgabedatensätzen für jeden Wert wie weiter unten beschrieben bestimmt. Für jeden Eingabedatensatz wird die maximale Anzahl von Ausgabedatensätzen berechnet. Alle Arrays oder Eigenschaftenbehälter werden parallel erweitert, sodass fehlende Werte (sofern vorhanden) durch NULL-Werte ersetzt werden. Elemente werden in der Reihenfolge, in der Sie im ursprünglichen Array/in der ursprünglichen Sammlung angezeigt werden, in Zeilen erweitert.

  3. Ist der dynamische Wert NULL, wird ein einzelner Datensatz für diesen Wert erstellt (NULL). Ist der dynamische Wert ein leeres Array oder ein leerer Eigenschaftenbehälter, wird kein Datensatz für diesen Wert erstellt. Andernfalls werden so viele Datensätze erstellt, wie es Elemente im dynamischen Wert gibt.

Die erweiterten Spalten sind vom Typ dynamic, es sei denn, sie werden explizit mit der Klausel to typeof() typisiert.

Erweiterungsmodi

Zwei Erweiterungsmodi für Eigenschaftenbehälter werden unterstützt:

  • bagexpansion=bag oder kind=bag: Eigenschaftenbehälter werden zu Eigenschaftenbehältern mit einem einzelnen Eintrag erweitert. Dieser Modus ist der Standardmodus.
  • bagexpansion=array oder kind=array: Eigenschaftenbehälter werden zu Arraystrukturen mit den beiden Elementen [Schlüssel,Wert] erweitert und lassen den einheitlichen Zugriff auf Schlüssel und Werte zu. Dieser Modus ermöglicht beispielsweise auch das Ausführen einer distinct-count-Aggregation über Eigenschaftsnamen.

Beispiele

Einzelne Spalte – Arrayerweiterung

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

Einzelspalte – Beutelerweiterung

Eine einfache Erweiterung einer einzelnen Spalte:

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

Einzelspalte – Beutelerweiterung auf Schlüsselwertpaare

Eine einfache Beutelerweiterung auf Schlüsselwertpaare:

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

Zippen zweier Spalten

Wenn Sie zwei Spalten erweitern, werden die entsprechenden Spalten zuerst „gezippt“ und dann erweitert:

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

Kartesisches Produkt von zwei Spalten

Wenn Sie ein kartesisches Produkt des Erweiterns von zwei Spalten erhalten möchten, erweitern Sie ein Spalte nach der anderen:

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

Ausgabe konvertieren

Wenn Sie die Ausgabe von mv-expand für einen bestimmten Typ (standardmäßig dynamisch) erzwingen möchten, verwenden Sie 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 
ColumnName ColumnOrdinal DateType ColumnType
a 0 System.String Zeichenfolge
b 1 System.Object dynamisch
c 2 System.Int32 INT

Beachten Sie, dass die Spalte b als dynamic zurückgegeben wird, während c als intzurückgegeben wird.

Verwenden von with_itemindex

Erweitern eines Arrays mit with_itemindex:

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

Weitere Informationen