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 [(|mv-expand
kind=
bag
)] [=
[to typeof(
] ...] [)
limit
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
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
:屬性包會展開為雙元素]
和值。 例如,此模式也允許對屬性名稱執行相異計數匯總。
範例
本文中的範例會使用 說明叢集中公開可用的數據表,例如 Samples 資料庫中的
StormEvents
數據表。
本文中的範例會使用公開可用的數據表,例如天氣分析中的
StormEvents
數據表,範例數據。
本節中的範例示範如何使用 語法來協助您開始使用。
單一數據行 - 陣列擴充
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 |
當傳回為 時b
,會傳dynamic
回通知數據行c
。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() 外掛程式。