mv-apply 演算子
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
サブクエリを各レコードに適用し、全サブクエリの結果の和集合を返します。
たとえば、テーブル T
に dynamic
型の列 Metric
があり、その値が real
数値の配列であるとします。 次のクエリでは、各 Metric
値の中で最も大きい 2 つの値を検索し、これらの値に対応するレコードを返します。
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
mv-apply
演算子には、以下の処理手順があります。
mv-expand
演算子を使用して、入力の各レコードをサブテーブルに展開します (順序は保持されます)。- 各サブテーブルのサブクエリを適用します。
- 結果のサブテーブルに 0 個以上の列を追加します。 これらの列は、展開されていないソース列の値を含んでおり、必要に応じて繰り返されます。
- 結果の和集合を返します。
mv-apply
演算子は次の入力を取得します。
展開する動的配列として評価される 1 つ以上の式。 展開された各サブテーブルのレコード数は、これらの各動的配列の最大長です。 複数の式が指定され、対応する配列の長さが異なる場合は、null 値が追加されます。
必要に応じて、展開後に式の値を割り当てる名前。 これらの名前は、サブテーブル内の列名になります。 指定しない場合、式が列参照であるときに、元の列の名前が使用されます。 それ以外の場合は、ランダムな名前が使用されます。
Note
既定の列名を使用することをお勧めします。
展開後の、動的配列の要素のデータ型。 これらは、サブテーブル内の列の列型になります。 指定しない場合は、
dynamic
が使用されます。必要に応じて、サブテーブル レコードを生成した配列内の要素の 0 から始まるインデックスを指定する、サブテーブルに追加する列の名前。
必要に応じて、展開する配列要素の最大数。
mv-apply
演算子は、mv-expand
演算子の一般化と考えることができます (実際、サブクエリにプロジェクションしか含まれていない場合は、前者によって後者を実装できます)
構文
T |
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery )
Itemindex に次の構文がある場合:
with_itemindex
=
IndexColumnName
ColumnsToExpand は、次の形式の 1 つ以上の要素をコンマで区切ったリストです。
[Name =
] ArrayExpression [to
typeof
(
Typename)
]
RowLimit は単純に次のようになります。
limit
RowLimit
また 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" } |
関連するコンテンツ
- mv-expand 演算子