Sdílet prostřednictvím


Operátor mv-expand

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Rozšiřuje dynamická pole s více hodnotami nebo kontejnery vlastností do více záznamů.

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

Syntaxe

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

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

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

Parametry

Název Type Požadováno Popis
ColumnName, ArrayExpression string ✔️ Odkaz na sloupec nebo skalární výraz s hodnotou typu dynamic , která obsahuje pole nebo tašku 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, rozbalená hodnota se ve výstupu rozšíří do nového sloupce. V opačném případě se stávající columnName nahradí.
Název string Název nového sloupce
Název typu string ✔️ Určuje základní typ prvků pole, který se stane typem sloupce vytvořeného operátorem mv-expand . Operace použití typu je pouze přetypování a nezahrnuje analýzu ani převod typu. Prvky pole, které neodpovídají deklarovanému typu, se stanou null hodnotami.
RowLimit 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.
IndexColumnName 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í rozbalené kolekci.

Návraty

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

  1. Vstupní sloupce, které nejsou rozbalené, se zobrazí ve výstupu s jejich 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ždou hodnotu ColumnName nebo ArrayExpression , která je rozbalována, je počet výstupních záznamů 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ě", aby chybějící hodnoty (pokud existují) byly nahrazeny hodnotami null. Prvky se rozbalí do řádků v pořadí, v jakém se zobrazují v původním poli nebo sáček.

  3. Pokud je dynamická hodnota null, vytvoří se pro tuto hodnotu jeden záznam (null). Pokud je dynamická hodnota prázdným polem nebo taškou vlastností, pro tuto hodnotu se neprodukuje žádný záznam. V opačném případě se vytvoří tolik záznamů, kolik obsahuje prvky v dynamické hodnotě.

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

Režimy rozšíření

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

  • kind=bag nebo bagexpansion=bag: Tašky na nemovitosti jsou rozšířeny na jednodávkové kontejnery majetku. Tento režim je výchozím režimem.
  • kind=arraynebo bagexpansion=array: Kontejnery vlastností jsou rozšířeny na struktury pole hodnot klíče], se dvěma prvky[, což umožňuje jednotný přístup ke klíčům a hodnotám. Tento režim umožňuje například spuštění agregace s jedinečným počtem nad 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

d b
1 10
0 20
2 d
2 b

Jeden sloupec – rozbalení 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

d b
0 {"prop1": "a1"}
0 {"prop2": "b1"}
2 {"prop1": "a2"}
2 {"prop2": "b2"}

Jeden sloupec – rozšíření sáčku na páry klíč-hodnota

Jednoduché rozšíření tašky na 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

d b key Val
0 ["prop1","a1"] prop1 a1
0 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

Zazipované dva sloupce

Rozbalením dvou sloupců nejprve zazipujte příslušné sloupce a pak je rozbalíte:

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

Výstup

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

Kartézský součin dvou sloupců

Pokud chcete získat kartézský součin rozbalení dvou sloupců, rozbalte jeden za 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

d b c
0 { "prop1": "a"} 5
0 { "prop1": "a"} 6
0 { "prop2": "b"} 5
0 { "prop2": "b"} 6

Převod výstupu

Pokud chcete vynutit výstup 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
d 0 System.String string
b 0 System.Object dynamic
c 2 System.Int32 int

Všimněte si, že sloupec b je vrácen, zatímco dynamic c je vrácen jako int.

Použití with_itemindex

Rozšíření pole s with_itemindex:

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

Výstup

linka Index
0 0
2 1
3 2
4 3