次の方法で共有


mv-apply 演算子

適用対象: ✅Microsoft FabricAzure データ エクスプローラーAzure MonitorMicrosoft Sentinel

サブクエリを各レコードに適用し、全サブクエリの結果の和集合を返します。

たとえば、テーブル Tdynamic 型の列 Metric があり、その値が real 数値の配列であるとします。 次のクエリでは、各 Metric 値の中で最も大きい 2 つの値を検索し、これらの値に対応するレコードを返します。

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

mv-apply 演算子には、以下の処理手順があります。

  1. mv-expand 演算子を使用して、入力の各レコードをサブテーブルに展開します (順序は保持されます)。
  2. 各サブテーブルのサブクエリを適用します。
  3. 結果のサブテーブルに 0 個以上の列を追加します。 これらの列は、展開されていないソース列の値を含んでおり、必要に応じて繰り返されます。
  4. 結果の和集合を返します。

mv-apply 演算子は次の入力を取得します。

  1. 展開する動的配列として評価される 1 つ以上の式。 展開された各サブテーブルのレコード数は、これらの各動的配列の最大長です。 複数の式が指定され、対応する配列の長さが異なる場合は、null 値が追加されます。

  2. 必要に応じて、展開後に式の値を割り当てる名前。 これらの名前は、サブテーブル内の列名になります。 指定しない場合、式が列参照であるときに、元の列の名前が使用されます。 それ以外の場合は、ランダムな名前が使用されます。

    Note

    既定の列名を使用することをお勧めします。

  3. 展開後の、動的配列の要素のデータ型。 これらは、サブテーブル内の列の列型になります。 指定しない場合は、dynamic が使用されます。

  4. 必要に応じて、サブテーブル レコードを生成した配列内の要素の 0 から始まるインデックスを指定する、サブテーブルに追加する列の名前。

  5. 必要に応じて、展開する配列要素の最大数。

mv-apply 演算子は、mv-expand 演算子の一般化と考えることができます (実際、サブクエリにプロジェクションしか含まれていない場合は、前者によって後者を実装できます)

構文

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

Itemindex に次の構文がある場合:

with_itemindex= IndexColumnName

ColumnsToExpand は、次の形式の 1 つ以上の要素をコンマで区切ったリストです。

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

RowLimit は単純に次のようになります。

limitRowLimit

また SubQuery の構文は、どのクエリ ステートメントでも同じです。

構文規則について詳しく知る。

パラメーター

件名 タイプ Required 説明
ItemIndex string 配列拡張フェーズの一部として入力に追加される long 型の列の名前を示し、展開された値の 0 から始まる配列インデックスを示します。
名前 string 配列展開された各式の配列展開値を割り当てる名前。 指定しない場合は、列の名前が使用可能な場合に使用されます。 ArrayExpressionが単純な列名でない場合は、ランダムな名前が生成されます。
ArrayExpression dynamic ✔️ 値が配列展開される配列。 式が入力内の列の名前である場合、入力列は入力から削除され、同じ名前の新しい列が削除されます。指定されている場合は ColumnName が出力に表示されます。
Typename string dynamic配列の個々の要素が受け取る型の名前ArrayExpression。 この型に準拠していない要素は、null 値に置き換えられます。 指定しない場合、 dynamic は既定で使用されます。
RowLimit int 入力の各レコードから生成するレコード数の制限。 指定しない場合は、2147483647が使用されます。
SubQuery string 配列展開された各サブテーブルに適用される暗黙的な表形式ソースを含む表形式クエリ式。

Note

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

配列内の最大の要素 2 つの合計を計算する

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

出力

インデックス 要素
3 7
4 9
3 8
4 10

複数の列を使用して 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-apply を内部 mv-expand と組み合わせて使用し、プロパティ バッグから "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"
}