mv-expand 運算子

將多值動態陣列或屬性包展開為為多筆記錄。

mv-expand 可以描述為與彙總運算子相反,而彙總運算子會將多個值封裝成單一動態類型的陣列或屬性包,例如 summarize ... make-list()make-series。 (純量) 陣列或屬性包中的每個元素都會在運算子的輸出中產生新的記錄。 系統會將輸入中所有未展開的資料行複製至輸出中的所有記錄。

語法

T|mv-expand [kind=(bag | array)] [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]

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
ColumnNameArrayExpression string ✔️ 數據行參考或純量表示式,其值為保存數位或屬性包的型 dynamic 別。 陣列或屬性包的個別最上層元素會展開為多筆記錄。
使用 ArrayExpressionName 不等於任何輸入資料行名稱時,會將展開的值延伸至輸出中的新資料行。 否則,會取代現有 ColumnName
名稱 string 新數據行的名稱。
Typename string ✔️ 表示陣列項目的基礎類型,這會成為運算子所產生的 mv-expand 數據行類型。 套用類型是只能轉換的作業,不會包含剖析或類型轉換。 不符合宣告類型的陣列元素會變成 null 值。
RowLimit int 每個原始數據列所產生的數據列數目上限。 預設為 2147483647。 mvexpand 是運算子 mv-expand 的舊版和過時形式。 舊版的預設資料列限制為 128 個。
IndexColumnName string 如果 with_itemindex 已指定,輸出會包含另一個名為 IndexColumnName 的數據行,其中包含從原始展開集合中專案 0 開始的索引。

傳回

針對輸入中的每筆記錄,運算子會在輸出中傳回零筆、一筆或多筆記錄,如下列方式所決定:

  1. 未展開的輸入資料行會與其原始值出現在輸出中。 如果將單一輸入記錄展開為多個輸出記錄,則會將此值複製至所有記錄。

  2. 對於展開的每個 ColumnNameArrayExpression ,輸出記錄的數目會根據每個值來決定,如 展開模式中所述。 針對每筆輸入記錄,會計算輸出記錄數目上限。 所有陣列或屬性包都會「平行」展開,因此,遺漏值 (如果有的話) 會取代為 Null 值。 元素會以其出現在原始陣列/包中的順序展開至資料列。

  3. 如果動態值為 Null,則會產生該值的單一記錄 (Null)。 如果動態值為空的陣列或屬性包,則不會產生該值的記錄。 否則,會隨著動態值中的元素而產生許多記錄。

除非使用 to typeof() 子句明確地輸入展開的資料行,否則這些資料行會是類型 dynamic

展開模式

系統支援兩種屬性包展開模式:

  • kind=bagbagexpansion=bag:屬性包會展開為單一項目屬性包。 此模式為預設模式。
  • kind=arraybagexpansion=array:屬性包會展開為二元素 [key,value] 陣列結構,以能夠統一存取索引鍵和值。 例如,此模式也可讓您對屬性名稱執行相異計數彙總。

範例

單一數據行 - 陣列擴充

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

單欄 - 包展開

單一資料行的簡單擴充:

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”}

單一數據行 - 包擴充至索引鍵/值組

索引鍵/值組的簡單包擴充:

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]

輸出

a b 索引鍵 val
1 [“prop1”,“a1”] prop1 a1
1 [“prop2”,“b1”] prop2 b1
2 [“prop1”,“a2”] prop1 a2
2 [“prop2”,“b2”] prop2 b2

已壓縮的兩個資料行

擴充兩個資料行會先「壓縮」適用的資料行,然後再加以擴充:

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

兩個資料行的笛卡兒乘積

如果您想要取得擴充兩個資料行的笛卡兒乘積,請一個接著一個地擴充資料行:

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

轉換輸出

若要將 mv-expand 的輸出強制為特定類型 (預設為動態),請使用 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 string
b 1 System.Object dynamic
c 2 System.Int32 int

請注意,會以 dynamic 形式傳回資料行 b,而以 int 形式傳回 c

使用 with_itemindex

使用 with_itemindex 擴充陣列:

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

輸出

x 索引
1 0
2 1
3 2
4 3