mv-expand 演算子
複数値の動的配列またはプロパティー・バッグを複数のレコードに展開します。
mv-expand は、複数の値を単一の 動的型配列またはプロパティー・バッグ ( summarize など) にパックする集約演算子の反対として記述できます。 make-list() および make-series。 (スカラー) 配列またはプロパティー・バッグ内の各エレメントは、オペレーターの出力に新規レコードを生成します。 展開されていない入力のすべての列は、出力内のすべてのレコードに複製されます。
構文
T | mv-expand [bagexpansion=(bag | array)] [with_itemindex=IndexColumnName] ColumnName [to typeof( Typename)] [, ColumnName ...] [limit Rowlimit]
T | mv-expand [bagexpansion=(bag | array)] 名前 = ArrayExpression [to typeof(Typename)] [, [Name =] ArrayExpression [to typeof(Typename)] ...] [limit Rowlimit]
引数
ColumnName、 ArrayExpression: 配列またはプロパティー・バッグを保持する、タイプ
dynamicの値を持つ列参照、またはスカラー式。 配列またはプロパティー・バッグの個々の最上位エレメントは、複数のレコードに拡張されます。
ArrayExpression が使用され、 Name がどの入力列名とも等しくない場合、拡張された値は出力の新しい列に拡張されます。 それ以外の場合は、既存の ColumnName が置き換えられます。「名前」: 新しい列の名前。
タイプ名: 配列のエレメントの基礎となるタイプを示します。これは、
mv-expand演算子によって生成される列のタイプになります。 型を適用する操作はキャスト専用であり、構文解析や型変換は含まれません。 宣言された型に準拠しない配列エレメントは、null値になります。RowLimit: 元の各行から生成された行の最大数。 デフォルトは 2147483647 です。
IndexColumn名前:
with_itemindexを指定した場合、出力には別の列 ( IndexColumnNameという名前) が含まれます。この列には、展開された元のコレクションの項目の索引 (0 から始まる) が含まれます。
返品
入力内のレコードごとに、オペレーターは、以下のように決定されたとおりに、ゼロ個、1 個、または複数個のレコードを出力に返します。
展開されていない入力列は、元の値で出力に表示されます。 単一の入力レコードが複数の出力レコードに拡張されると、値はすべてのレコードに複写されます。
展開される ColumnName または ArrayExpression ごとに、値ごとに出力レコードの数が決定されます ( 後述を参照)。 入力レコードごとに、出力レコードの最大数が計算されます。 すべての配列またはプロパティー・バッグは、欠落値 (存在する場合) がヌル値に置き換えられるように「並列」に拡張されます。 エレメントは、元の配列/バッグに現れる順序で行に展開されます。
動的値が NULL の場合は、その値 (NULL) に対して単一のレコードが生成されます。 動的値が空の配列またはプロパティー・バッグの場合、その値のレコードは作成されません。 それ以外の場合は、動的値にあるエレメントの数と同じ数のレコードが作成されます。
拡張された列は、 to typeof() 節を使用して明示的に型付けされていない限り、 dynamic型になります。
拡張モード
プロパティー・バッグ拡張の 2 つのモードがサポートされています。
bagexpansion=bagまたはkind=bag: プロパティー・バッグは、単一エントリー・プロパティー・バッグに拡張されます。 このモードはデフォルト・モードです。bagexpansion=arrayまたはkind=array: プロパティー・バッグが 2 つのエレメント[key,value]配列構造に拡張され、キーと値へのアクセスが統一されます。 このモードでは、例えば、プロパティー名に対して個別カウント集約を実行することもできます。
例
単一列
単一の列の単純な拡張:
events
| project severity, name, ipv4_addrs=ipv4_addr___value, ipv4_addrs_ctx=ipv4_addr___context,
original_time=unixtime_milliseconds_todatetime(original_time),
src_ip=network_traffic___x_src_ipv4_value[0],
dst_ip=network_traffic___x_dst_ipv4_value[0]
| where original_time > ago(24h) and src_ip != dst_ip
| take 2 // Only take 2 rows to expand
| mv-expand with_itemindex=idx ipv4_addrs, ipv4_addrs_ctx
| project idx, name, ipv4_addrs, ipv4_addrs_ctx
datatable (a:int, b:dynamic)[1,dynamic({"prop1":"a", "prop2":"b"})]
| mv-expand b
結果
| a | b |
|---|---|
| 1 | {"prop1":"a"} |
| 1 | {"prop2":"b"} |
Zip された 2 つの列
2 つの列を展開すると、まず該当する列が「zip」されてから展開されます。
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 |
2 列のデカルト積
2 つの列を展開するデカルト積を取得するには、次のように 1 つずつ展開します。
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 | ストリング |
| b | 1 | System.Object | ダイナミック |
| 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 |