mv-expand 運算子
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
將多重值動態數位或屬性包展開為多個記錄。
mv-expand
可以描述為將多個值封裝成單 一動態型別數位或屬性包的匯總運算元相反,例如 summarize
... make-list()
和 make-series
。
(純量) 陣列或屬性包中的每個元素都會在運算子的輸出中產生新記錄。 未展開之輸入的所有數據行都會複製到輸出中的所有記錄。
語法
T |mv-expand
[kind=
(bag
| array
)] [with_itemindex=
IndexColumnName] ColumnName [ Typename)
] [to typeof(
ColumnName ...] [limit
,
Rowlimit]
T [(bag
array
| )] [kind=
Name] ArrayExpression [to typeof(
Typename)
] [,
[Name =
=
] ArrayExpression [to typeof(
Typename)
] ...] [limit
Rowlimit]|mv-expand
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
ColumnName、 ArrayExpression | string |
✔️ | 數據行參考,或純量表達式,其值為保存數位或屬性包的 型 dynamic 別。 數位或屬性包的個別最上層元素會展開成多個記錄。使用 ArrayExpression 且 Name 不等於任何輸入資料行名稱時,擴充的值會延伸至輸出中的新數據行。 否則,會取代現有的 ColumnName 。 |
名稱 | string |
新數據行的名稱。 | |
Typename | string |
✔️ | 指出陣列項目的基礎類型,這會成為運算子所產生的 mv-expand 數據行類型。 套用類型的作業僅限轉換,且不包含剖析或類型轉換。 不符合宣告類型的陣列元素會變成 null 值。 |
RowLimit | int |
從每個原始數據列產生的數據列數目上限。 預設值為 2147483647。 mvexpand 是運算子 mv-expand 的舊版和過時形式。 舊版的預設數據列限制為128。 |
|
IndexColumnName | string |
如果with_itemindex 指定,輸出會包含另一個名為 IndexColumnName 的數據行,其中包含從原始展開集合中專案 0 開始的索引。 |
傳回
針對輸入中的每個記錄,運算符會傳回輸出中的零、一或多個記錄,如下列方式決定:
未展開的輸入數據列會顯示在其原始值的輸出中。 如果單一輸入記錄展開成多個輸出記錄,值就會複製到所有記錄。
針對已展開的每個 ColumnName 或 ArrayExpression,輸出記錄數目會針對每個值決定,如展開模式中所述。 針對每個輸入記錄,會計算輸出記錄的最大數目。 所有陣列或屬性包都會「平行」展開,因此遺漏值(如果有的話)會以 Null 值取代。 元素會依出現在原始數位/包中的順序展開成數據列。
如果動態值為 null,則會針對該值產生單一記錄(null)。 如果動態值是空數位或屬性包,則不會針對該值產生任何記錄。 否則,會產生許多記錄,因為動態值中有元素。
展開的數據行類型為 dynamic
,除非它們是使用 to typeof()
子句明確類型。
擴充模式
支援兩種屬性包擴充模式:
kind=bag
或bagexpansion=bag
:屬性包會展開成單一輸入屬性包。 此模式是預設模式。kind=array
或bagexpansion=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 | key | 數量 |
---|---|---|---|
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
回通知數據行b
。int
使用 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 |
相關內容
- mv-apply 運算符。
- 如需mv-expand運算符的相反,請參閱 summarize make_list()。
- 如需使用屬性包索引鍵將動態 JSON 物件擴充至數據行,請參閱 bag_unpack() 外掛程式。