共用方式為


mv-expand 運算符

將多重值動態數位或屬性包展開為多個記錄。

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

語法

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

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

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
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)。 如果動態值是空數位或屬性包,則不會針對該值產生任何記錄。 否則,會產生許多記錄,因為動態值中有元素。

展開的數據行類型為 dynamic,除非它們是使用 to typeof() 子句明確類型。

擴充模式

支援兩種屬性包擴充模式:

  • kind=bagbagexpansion=bag:屬性包會展開成單一輸入屬性包。 此模式是預設模式。
  • kind=arraybagexpansion=array:屬性包會展開為雙元素[索引鍵值]陣列結構,允許統一存取索引鍵,和值。 例如,此模式也允許對屬性名稱執行相異計數匯總。

範例

單一數據行 - 陣列擴充

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 索引鍵 數量
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 展開的輸出強制為特定類型(預設值為動態),請使用 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

當傳回為 時c,會傳dynamic回通知數據行bint

使用 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