mv-expand 運算子
將多值動態陣列或屬性包展開為為多筆記錄。
mv-expand
可以描述為與彙總運算子相反,而彙總運算子會將多個值封裝成單一動態類型的陣列或屬性包,例如 summarize
... make-list()
和 make-series
。
(純量) 陣列或屬性包中的每個元素都會在運算子的輸出中產生新的記錄。 系統會將輸入中所有未展開的資料行複製至輸出中的所有記錄。
語法
T|mv-expand
[kind=
(bag
| array
)] [with_itemindex=
IndexColumnName] ColumnName [to typeof(
Typename)
] [,
ColumnName ...] [limit
Rowlimit]
T|mv-expand
[kind=
() bag
array
| ] [Name] ArrayExpression [to typeof(
Typename)
] [,
[Name=
=
] ArrayExpression [to typeof(
Typename)
] ...] [limit
Rowlimit]
深入瞭解 語法慣例。
參數
名稱 | 類型 | 必要 | Description |
---|---|---|---|
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)。 如果動態值為空的陣列或屬性包,則不會產生該值的記錄。 否則,會隨著動態值中的元素而產生許多記錄。
除非使用 to typeof()
子句明確地輸入展開的資料行,否則這些資料行會是類型 dynamic
。
展開模式
系統支援兩種屬性包展開模式:
kind=bag
或bagexpansion=bag
:屬性包會展開為單一項目屬性包。 此模式為預設模式。kind=array
或bagexpansion=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 |
相關內容
- 如需更多範例,請參閱 一段時間的即時活動計數。
- mv-apply 運算子。
- 如需mv-expand運算元的相反專案,請參閱 摘要make_list () 。
- 如需使用屬性包索引鍵將動態 JSON 對象擴充到數據行,請參閱 bag_unpack () 外掛程式。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應