GitHubContribute in GitHub: オンラインでの編集

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]

引数

  • ColumnNameArrayExpression: 配列またはプロパティー・バッグを保持する、タイプ dynamicの値を持つ列参照、またはスカラー式。 配列またはプロパティー・バッグの個々の最上位エレメントは、複数のレコードに拡張されます。
    ArrayExpression が使用され、 Name がどの入力列名とも等しくない場合、拡張された値は出力の新しい列に拡張されます。 それ以外の場合は、既存の ColumnName が置き換えられます。

  • 「名前」: 新しい列の名前。

  • タイプ名: 配列のエレメントの基礎となるタイプを示します。これは、 mv-expand 演算子によって生成される列のタイプになります。 型を適用する操作はキャスト専用であり、構文解析や型変換は含まれません。 宣言された型に準拠しない配列エレメントは、 null 値になります。

  • RowLimit: 元の各行から生成された行の最大数。 デフォルトは 2147483647 です。

  • IndexColumn名前: with_itemindex を指定した場合、出力には別の列 ( IndexColumnNameという名前) が含まれます。この列には、展開された元のコレクションの項目の索引 (0 から始まる) が含まれます。

返品

入力内のレコードごとに、オペレーターは、以下のように決定されたとおりに、ゼロ個、1 個、または複数個のレコードを出力に返します。

  1. 展開されていない入力列は、元の値で出力に表示されます。 単一の入力レコードが複数の出力レコードに拡張されると、値はすべてのレコードに複写されます。

  2. 展開される ColumnName または ArrayExpression ごとに、値ごとに出力レコードの数が決定されます ( 後述を参照)。 入力レコードごとに、出力レコードの最大数が計算されます。 すべての配列またはプロパティー・バッグは、欠落値 (存在する場合) がヌル値に置き換えられるように「並列」に拡張されます。 エレメントは、元の配列/バッグに現れる順序で行に展開されます。

  3. 動的値が 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

bdynamic として返され、 cintとして返されます。

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