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 [kind=(bagarray | )] [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]

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
ColumnName, ArrayExpression string ✔️ 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 string Ein Name für die neue Spalte.
Typename string ✔️ Gibt den zugrunde liegenden Typ der Elemente des Arrays an, der zum Typ der vom Operator erzeugten mv-expand Spalte wird. Der Vorgang zum Anwenden des Typs ist nur Umwandlung und umfasst keine Analyse oder Typkonvertierung. Arrayelemente, die dem deklarierten Typ nicht entsprechen, werden zu null Werten.
RowLimit int Die maximale Anzahl von Zeilen, die aus jeder ursprünglichen Zeile generiert werden. Der Standardwert ist 2147483647. mvexpand ist eine Legacy- und veraltete Form des Operators mv-expand. Die Legacyversion weist ein Standardzeilenlimit von 128 auf.
IndexColumnName string Wenn with_itemindex angegeben wird, enthält die Ausgabe eine weitere Spalte namens IndexColumnName , die den Index ab 0 des Elements in der ursprünglichen erweiterten Auflistung 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 der Ausgabedatensätze für jeden Wert bestimmt, wie unter Erweiterungsmodi erläutert. 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:

  • kind=bag oder bagexpansion=bag: Eigenschaftenbehälter werden zu Eigenschaftenbehältern mit einem einzelnen Eintrag erweitert. Dieser Modus ist der Standardmodus.
  • kind=array oder bagexpansion=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

Einzelspalte – Arrayerweiterung

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

Ausgabe

a b
1 10
1 20
2 a
2 b

Einzelspalte – Taschenerweiterung

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

Ausgabe

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

Einzelspalte: Taschenerweiterung auf Schlüssel-Wert-Paare

Eine einfache Taschenerweiterung auf Schlüssel-Wert-Paare:

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]

Ausgabe

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

Ausgabe

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

Ausgabe

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 

Ausgabe

ColumnName ColumnOrdinal DateType ColumnType
a 0 System.String string
b 1 System.Object dynamic
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

Ausgabe

x Index
1 0
2 1
3 2
4 3