Operátor mv-expand

Rozbalí dynamická pole s více hodnotami nebo kontejnery vlastností do více záznamů.

mv-expand lze popsat jako opak operátorů agregace, které sbalí více hodnot do jednoho pole nebo kontejneru vlastností dynamického typu, například summarize ... make-list() a make-series. Každý prvek v (skalárním) poli nebo kontejneru vlastností generuje nový záznam ve výstupu operátoru . Všechny sloupce vstupu, které nejsou rozbalené, se duplikují do všech záznamů ve výstupu.

Syntax

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

T|mv-expand [kind=(bag | array)] [Název=] ArrayExpression [to typeof(Název_typu)] [, [Název=] ArrayExpression [to typeof(Název_typu)] ...] [limitRowlimit]

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Typ Vyžadováno Popis
ColumnName, ArrayExpression string ✔️ Odkaz na sloupec nebo skalární výraz s hodnotou typu dynamic , která obsahuje pole nebo kontejner vlastností. Jednotlivé prvky nejvyšší úrovně pole nebo kontejneru vlastností se rozbalí do více záznamů.
Když se použije ArrayExpression a Název se nerovná žádnému názvu vstupního sloupce, rozšířená hodnota se ve výstupu rozšíří do nového sloupce. V opačném případě se stávající sloupec ColumnName nahradí.
Název string Název nového sloupce
Typename string ✔️ Označuje podkladový typ prvků pole, který se stane typem sloupce vytvořeného operátorem mv-expand . Operace použití typu je pouze přetypovaná a nezahrnuje parsování ani převod typu. Prvky pole, které neodpovídají deklarovanému typu, se stanou null hodnotami.
Omezení řádků int Maximální počet řádků vygenerovaných z každého původního řádku Výchozí hodnota je 2147483647. mvexpand je starší a zastaralá forma operátoru mv-expand. Starší verze má výchozí limit řádků 128.
Názevsloupce indexu string Pokud with_itemindex je zadán, výstup obsahuje další sloupec s názvem IndexColumnName , který obsahuje index začínající na 0 položky v původní rozšířené kolekci.

Návraty

Pro každý záznam ve vstupu vrátí operátor ve výstupu nula, jeden nebo více záznamů, jak je určeno následujícím způsobem:

  1. Vstupní sloupce, které nejsou rozbalené, se ve výstupu zobrazí s původní hodnotou. Pokud je jeden vstupní záznam rozbalený do více výstupních záznamů, hodnota se duplikuje na všechny záznamy.

  2. Pro každý sloupec ColumnName nebo ArrayExpression , který je rozbalený, počet výstupních záznamů je určen pro každou hodnotu, jak je vysvětleno v režimech rozšíření. Pro každý vstupní záznam se vypočítá maximální počet výstupních záznamů. Všechna pole nebo kontejnery vlastností jsou rozbalené "paralelně" tak, aby chybějící hodnoty (pokud existují) byly nahrazeny hodnotami null. Prvky jsou rozbalené do řádků v pořadí, v jakém se zobrazují v původním poli nebo kontejneru.

  3. Pokud je dynamická hodnota null, vytvoří se pro tuto hodnotu jeden záznam (null). Pokud je dynamickou hodnotou prázdné pole nebo kontejner vlastností, nevytvoře se pro tuto hodnotu žádný záznam. V opačném případě se vytvoří tolik záznamů, kolik je prvků v dynamické hodnotě.

Rozbalené sloupce jsou typu dynamic, pokud nejsou explicitně zadány pomocí klauzule to typeof() .

Režimy rozšíření

Podporují se dva režimy rozšíření kontejneru vlastností:

  • kind=bag nebo bagexpansion=bag: Kontejnery vlastností jsou rozbalené do kontejneru vlastností s jednou položkou. Tento režim je výchozím režimem.
  • kind=arraynebo bagexpansion=array: Kontejnery vlastností jsou rozbalené dostruktur polehodnot klíčů,] se dvěma prvky[, což umožňuje jednotný přístup ke klíčům a hodnotám. Tento režim také umožňuje například spuštění agregace distinct-count pro názvy vlastností.

Příklady

Jeden sloupec – rozšíření pole

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

Výstup

pro b
1 10
1 20
2 pro
2 b

Jednosloupce - rozšíření sáčku

Jednoduché rozšíření jednoho sloupce:

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

Výstup

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

Jeden sloupec – rozšíření sáčku do párů klíč-hodnota

Jednoduché rozšíření tašky o páry klíč-hodnota:

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]

Výstup

pro b key Val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 B2

Zazipované dva sloupce

Rozbalením dvou sloupců se nejprve "zazipují" příslušné sloupce a pak se rozbalí:

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

Výstup

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

Kartézský součin dvou sloupců

Pokud chcete získat kartézský součin rozbalení dvou sloupců, rozbalte jeden po druhém:

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

Výstup

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

Převést výstup

Pokud chcete vynutit výstup funkce mv-expand na určitý typ (výchozí hodnota je dynamická), použijte 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 

Výstup

ColumnName Sloupcový pořadový Typ data ColumnType
pro 0 System.string string
b 1 System.Object dynamic
c 2 System.Int32 int

Sloupec b oznámení se vrátí jako dynamic , zatímco c sloupec se vrátí jako int.

Používání with_itemindex

Rozšíření pole pomocí with_itemindex:

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

Výstup

x Index
1 0
2 1
3 2
4 3