Share via


mv-expand 演算子

複数の値の動的配列またはプロパティ バッグを複数のレコードに展開します。

mv-expand は、複数の値を 1 つの動的に型指定された配列またはプロパティ バッグ (summarize ... make-list()make-series など) にパックする集計演算子の反対のものとして説明できます。 (スカラー) 配列またはプロパティ バッグ内の各要素により、演算子の出力に新しいレコードが生成されます。 展開されない入力のすべての列は、出力のすべてのレコードに複製されます。

構文

T|mv-expand [kind=(bag | array)] [with_itemindex=IndexColumnName] ColumnName [to typeof(Typename)] [,ColumnName ...] [limitRowlimit]

T|mv-expand [kind=(bag | array)] [Name=] ArrayExpression [to typeof(Typename)] [, [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]

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

パラメーター

名前 必須 説明
ColumnNameArrayExpression string ✔️ 列参照、または配列またはプロパティ バッグを保持する型 dynamic の値を持つスカラー式。 配列またはプロパティ バッグの個々の最上位レベルの要素は、複数のレコードに展開されます。
ArrayExpression が使用され、Name がいずれの入力列名とも等しくない場合、展開された値は出力の新しい列に拡張されます。 それ以外の場合は、既存の ColumnName が置き換えられます。
名前 string 新しい列の名前。
Typename string ✔️ 配列の要素の基になる型を示します。これは、 演算子によって mv-expand 生成される列の型になります。 型を適用する操作はキャストのみであり、解析や型変換は含まれません。 宣言された型に準拠していない配列要素は値になります null
RowLimit int 元の行ごとに生成される行の最大数。 既定値は 2147483647 です。 mvexpand は、mv-expand 演算子の古いレガシ形式です。 レガシ バージョンでの既定の行の制限は 128 です。
IndexColumnName string が指定されている場合 with_itemindex 、出力には IndexColumnName という名前の別の列が含まれます。この列には、元の展開されたコレクション内の項目の 0 から始まるインデックスが含まれます。

戻り値

入力の各レコードについて、演算子は、次の方法で決定されるように、出力で 0 個、1 個、または多数のレコードを返します。

  1. 展開されない入力列は、元の値で出力に表示されます。 1 つの入力レコードが複数の出力レコードに展開された場合、その値はすべてのレコードに複製されます。

  2. 展開される ColumnName または ArrayExpression ごとに、 展開モードで説明されているように、出力レコードの数が値ごとに決定されます。 入力レコードごとに、出力レコードの最大数が計算されます。 すべての配列またはプロパティ バッグは "並行して" 展開され、欠損値 (存在する場合) は null 値に置き換えられます。 要素は、元の配列またはバッグに出現する順序で行に展開されます。

  3. 動的な値が null の場合、その値 (null) に対して 1 つのレコードが生成されます。 動的な値が空の配列またはプロパティ バッグの場合、その値に対してレコードは生成されません。 それ以外の場合は、動的な値に含まれる要素と同数のレコードが生成されます。

展開された列は、to typeof() 句を使用して明示的に型指定されている場合を除き、dynamic 型です。

展開のモード

2 つのモードのプロパティ バッグの展開がサポートされています。

  • kind=bag または bagexpansion=bag: プロパティ バッグは、単一エントリのプロパティ バッグに展開されます。 これは既定のモードです。
  • kind=array または bagexpansion=array: プロパティ バッグは 2 つの要素 [key,value] の配列構造に展開されるため、キーと値への一貫したアクセスが可能です。 このモードでは、たとえば、プロパティ名での個別のカウントの集計を実行することもできます。

単一列 - 配列の展開

datatable (a: int, b: dynamic)
[
    1, dynamic([10, 20]),
    2, dynamic(['a', 'b'])
]
| mv-expand b

出力

a b
1 10
1 20
2 a
2 b

単一列 - バッグの展開

1 つの列の単純な展開:

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b

出力

a b
1 {"prop1": "a1"}
1 {"prop2": "b1"}
2 {"prop1": "a2"}
2 {"prop2": "b2"}

単一列 - キーと値のペアへのバッグの展開

キーと値のペアへの単純なバッグの展開:

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand kind=array b 
| extend key = b[0], val=b[1]

出力

a b key val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

圧縮された 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 つの列のデカルト積を取得する場合は、一方を展開した後で他方を展開します。

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 の出力を特定の型に強制的に展開するには (既定値は dynamic)、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 [列の型]
a 0 System.String string
b 1 System.Object dynamic
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