共用方式為


mv-apply 運算符

將子查詢套用至每個記錄,並傳回所有子查詢結果的聯集。

例如,假設數據表T具有類型的dynamic數據行Metric,其值是數字數位數位。real 下列查詢會找出每個 Metric 值中的兩個最大值,並傳回對應至這些值的記錄。

T | mv-apply Metric to typeof(real) on 
(
   top 2 by Metric desc
)

運算子 mv-apply 具有下列處理步驟:

  1. mv-expand使用 運算子,將輸入中的每個記錄展開為子數據表(保留順序)。
  2. 套用每個子數據表的子查詢。
  3. 將零個或多個數據行加入至產生的子數據表。 這些數據行包含未展開之源數據行的值,並視需要重複。
  4. 傳回結果的聯集。

運算子 mv-apply 會取得下列輸入:

  1. 評估為動態數位的一或多個表達式,以展開。 每個展開子數據表中的記錄數目是這些動態數位的最大長度。 在指定多個表達式且對應的數位具有不同的長度時,會加入 Null 值。

  2. 選擇性地,在展開之後指派表達式值的名稱。 這些名稱會成為子數據表中的數據行名稱。 如果未指定,當表示式是數據行參考時,會使用數據行的原始名稱。 否則會使用隨機名稱。

    注意

    建議使用預設數據行名稱。

  3. 展開之後,這些動態數位元素的數據類型。 這些會成為子數據表中數據行的數據行類型。 如果未指定,就會使用 dynamic

  4. 選擇性地,要加入至子數據表的數據行名稱,這個子數據表會指定產生子數據表之數位中元素的0起始索引。

  5. 選擇性地,要展開的陣列元素數目上限。

運算符 mv-apply 可以視為運算子的 mv-expand 一般化(事實上,如果子查詢只包含投影,則前者可以實作後者。

語法

T | mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on ( SubQuery )

其中 ItemIndex 具有語法:

with_itemindex= IndexColumnName

ColumnsToExpand 是表單一或多個專案的逗號分隔清單:

[Name =] ArrayExpression [to typeof(Typename])

RowLimit 只是:

limitRowLimit

SubQuery 具有任何查詢語句的相同語法。

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
ItemIndex string 表示類型數據行的名稱,這個數據行會附加至輸入做為陣列擴充階段的一 long 部分,並指出擴充值的0陣列索引。
名稱 string 要指派每個數位展開表達式之數位展開值的名稱。 如果未指定,則會使用數據行的名稱。 如果 ArrayExpression 不是簡單的資料行名稱,就會產生隨機名稱。
ArrayExpression dynamic ✔️ 陣列,其值為陣列展開。 如果表達式是輸入中的數據行名稱,則會從輸入中移除輸入數據行,並移除相同名稱的新數據行,或 指定時會出現 ColumnName
Typename string 數位 ArrayExpression 個別項目dynamic採用的類型名稱。 不符合此類型的元素會由 Null 值取代。 如果未指定, dynamic 預設會使用 。
RowLimit int 從輸入的每個記錄產生記錄數目的限制。 如果未指定,則會使用2147483647。
SubQuery string 具有隱含表格式來源的表格式查詢表達式,會套用至每個數位展開的子數據表。

注意

mv-expand與運算符不同,mv-apply運算符不支持bagexpand=array展開。 如果要展開的表達式是屬性包而非數位,您可以使用內部 mv-expand 運算元(請參閱下列範例)。

範例

從陣列取得最大的元素

let _data =
    range x from 1 to 8 step 1
    | summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply element=l to typeof(long) on 
    (
    top 1 by element
    )

輸出

xMod2 l 項目
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

計算數位中最大兩個專案的總和

let _data =
    range x from 1 to 8 step 1
    | summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply l to typeof(long) on
    (
    top 2 by l
    | summarize SumOfTop2=sum(l)
    )

輸出

xMod2 l SumOfTop2
1 [1,3,5,7] 12
0 [2,4,6,8] 14

選取陣列中的元素

datatable (Val:int, Arr1:dynamic, Arr2:dynamic)
[ 1, dynamic(['A1', 'A2', 'A3']),       dynamic([10, 30, 7]), 
  7, dynamic(['B1', 'B2', 'B5']),       dynamic([15, 11, 50]),
  3, dynamic(['C1', 'C2', 'C3', 'C4']), dynamic([6, 40, 20, 8])
] 
| mv-apply NewArr1=Arr1, NewArr2=Arr2 to typeof(long) on (
 top 2 by NewArr2
 | summarize NewArr1=make_list(NewArr1), NewArr2=make_list(NewArr2)
)

輸出

Val1 Arr1 Arr2 NewArr1 NewArr2
1 [“A1”,“A2”,“A3”] [10,30,7] [“A2',”A1“] [30,10]
7 [“B1”,“B2”,“B5”] [15,11,50] [“B5”,“B1”] [50,15]
3 [“C1”,“C2”,“C3”,“C4”] [6,40,20,8] [“C2”,“C3”] [40,20]

使用 with_itemindex 來處理陣列的子集

let _data =
    range x from 1 to 10 step 1
    | summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply with_itemindex=index element=l to typeof(long) on 
    (
    // here you have 'index' column
    where index >= 3
    )
| project index, element

輸出

index 項目
3 7
4 9
3 8
4 10

使用 Mutiple 資料行聯結 2 個陣列的元素

datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
    1, dynamic(['A1', 'A2', 'A3']), dynamic(['B1', 'B2', 'B3']), 
    5, dynamic(['C1', 'C2']), dynamic(['D1', 'D2'])
] 
| mv-apply Arr1, Arr2 on (
    extend Out = strcat(Arr1, "_", Arr2)
    | summarize Arr1 = make_list(Arr1), Arr2 = make_list(Arr2), Out= make_list(Out)
    )

輸出

Val Arr1 Arr2 Out
1 [“A1”,“A2”,“A3”] [“B1”,“B2”,“B3”] [“A1_B1”、“A2_B2”、“A3_B3”]
5 [“C1”,“C2”] [“D1”,“D2”] [“C1_D1”,“C2_D2”]

套用mv-apply至屬性包

在下列範例中,會與內部mv-expand搭配使用,mv-apply從屬性包中移除未以 「555」 開頭的值:

datatable(SourceNumber: string, TargetNumber: string, CharsCount: long)
[
    '555-555-1234', '555-555-1212', 46,
    '555-555-1212', '', int(null)
]
| extend values = pack_all()
| mv-apply removeProperties = values on 
    (
    mv-expand kind = array values
    | where values[1] !startswith "555"
    | summarize propsToRemove = make_set(values[0])
    )
| extend values = bag_remove_keys(values, propsToRemove)
| project-away propsToRemove

輸出

SourceNumber TargetNumber CharsCount
555-555-1234 555-555-1212 46 {
“SourceNumber”: “555-555-1234”,
“TargetNumber”: “555-555-1212”
}
555-555-1212     {
“SourceNumber”: “555-555-1212”
}