Share via


mv-expand-operatorn

Expanderar dynamiska matriser eller egenskapspåsar med flera värden till flera poster.

mv-expand kan beskrivas som motsatsen till de aggregeringsoperatorer som packar flera värden i en enda dynamisk typ av matris eller egenskapsuppsättning, till exempel summarize ... make-list() och make-series. Varje element i matrisen (skalär) eller egenskapsuppsättningen genererar en ny post i operatorns utdata. Alla kolumner i indata som inte expanderas dupliceras till alla poster i utdata.

Syntax

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

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

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk Beskrivning
ColumnName, ArrayExpression string ✔️ En kolumnreferens eller ett skalärt uttryck med ett värde av typen dynamic som innehåller en matris eller en egenskapsuppsättning. De enskilda elementen på den översta nivån i matrisen eller egenskapsuppsättningen expanderas till flera poster.
När ArrayExpression används och Namn inte är lika med något indatakolumnnamn utökas det expanderade värdet till en ny kolumn i utdata. Annars ersätts det befintliga ColumnName .
Namn string Ett namn på den nya kolumnen.
Typename string ✔️ Anger den underliggande typen av matriselement, som blir den typ av kolumn som genereras av operatorn mv-expand . Användningen av typen är endast cast-only och omfattar inte parsning eller typkonvertering. Matriselement som inte överensstämmer med den deklarerade typen blir null värden.
RowLimit int Det maximala antalet rader som genereras från varje ursprunglig rad. Standardvärdet är 2147483647. mvexpand är en äldre och föråldrad form av operatorn mv-expand. Den äldre versionen har en standardradgräns på 128.
IndexColumnName string Om with_itemindex anges innehåller utdata en annan kolumn med namnet IndexColumnName som innehåller indexet från och med 0 för objektet i den ursprungliga expanderade samlingen.

Returer

För varje post i indata returnerar operatorn noll, en eller flera poster i utdata, enligt följande:

  1. Indatakolumner som inte expanderas visas i utdata med sitt ursprungliga värde. Om en enskild indatapost expanderas till flera utdataposter dupliceras värdet till alla poster.

  2. För varje ColumnName eller ArrayExpression som expanderas bestäms antalet utdataposter för varje värde enligt beskrivningen i expansionslägen. För varje indatapost beräknas det maximala antalet utdataposter. Alla matriser eller egenskapspåsar expanderas "parallellt" så att saknade värden (om sådana finns) ersätts med null-värden. Element expanderas till rader i den ordning som de visas i den ursprungliga matrisen/påsen.

  3. Om det dynamiska värdet är null skapas en enda post för det värdet (null). Om det dynamiska värdet är en tom matris eller egenskapsuppsättning skapas ingen post för det värdet. Annars skapas så många poster som det finns element i det dynamiska värdet.

De expanderade kolumnerna är av typen dynamic, såvida de inte uttryckligen skrivs med hjälp to typeof() av -satsen.

Expansionslägen

Två lägen för expansioner av egenskapsuppsättningar stöds:

  • kind=bag eller bagexpansion=bag: Egenskapspåsar expanderas till enstaka egenskapspåsar. Det här läget är standardläget.
  • kind=arrayeller bagexpansion=array: Egenskapspåsar expanderas till matrisstrukturer med två element,][, vilket ger enhetlig åtkomst till nycklar och värden. I det här läget kan du till exempel köra en distinkt sammansättning över egenskapsnamn.

Exempel

En kolumn – matrisexpansion

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

Resultat

a b
1 10
1 20
2 a
2 b

En kolumn – påsexpansion

En enkel expansion av en enda kolumn:

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

Resultat

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

En kolumn – påsexpansion till nyckel/värde-par

En enkel påse-expansion till nyckel/värde-par:

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]

Resultat

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

Komprimerade två kolumner

Om du expanderar två kolumner "zippar" du först de tillämpliga kolumnerna och expanderar dem sedan:

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

Resultat

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

Kartesisk produkt av två kolumner

Om du vill få en kartesisk produkt av att expandera två kolumner expanderar du den ena efter den andra:

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

Resultat

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

Konvertera utdata

Om du vill tvinga utdata från en mv-expandering till en viss typ (standardvärdet är dynamiskt) använder du 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 

Resultat

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

Meddelandekolumnen b returneras som dynamic medan c returneras som int.

Använda with_itemindex

Expansion av en matris med with_itemindex:

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

Resultat

x Index
1 0
2 1
3 2
4 3