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

動的データ型

dynamic スカラー・データ型は、配列およびプロパティー・バッグだけでなく、以下のリストにある他のスカラー・データ型の任意の値を取ることができるという点で特殊なデータ型です。 具体的には、 dynamic 値は以下のようになります。

  • NULL。
  • 任意のプリミティブ・スカラー・データ型 ( booldatetimeguidintlongrealstring、および timespan) の値。
  • ゼロ・ベースの索引付けでゼロ個以上の値を保持する dynamic 値の配列。
  • 固有の string 値を dynamic 値にマップするプロパティー・バッグ。 プロパティー・バッグには、固有の string 値によって索引付けされた、ゼロ個以上のそのようなマッピング (「スロット」と呼ばれる) があります。 スロットは順不同です。

注。

* Values of type `dynamic` are limited to 1MB (2^20), uncompressed.

* Although the `dynamic` type appears JSON-like, it can hold values that the JSON
model does not represent because they don't exist in JSON (e.g.,
`long`, `real`, `datetime`, `timespan`, and `guid`).

Therefore, in serializing `dynamic` values into a JSON representation, values that JSON can't represent
are serialized into `string` values. Conversely, KQL will parse strings
as strongly-typed values if they can be parsed as such.
This applies for `datetime`, `real`, `long`, and `guid` types.
For more about the JSON object model, see [json.org](https://json.org/).

* KQL doesn't attempt to preserve the order of name-to-value mappings in
a property bag, and so you can't assume the order to be preserved. It's entirely
possible for two property bags with the same set of mappings to yield different
results when they are represented as `string` values, for example.

動的リテラル

dynamic 型のリテラルは、次のようになります。

dynamic( )

「値」 は以下のいずれかです。

  • null。この場合、リテラルはヌルの動的値 dynamic(null)を表します。
  • 別のスカラー・データ型リテラル。この場合、リテラルは「内部」型の dynamic リテラルを表します。 例えば、 dynamic(4) は、long スカラー・データ型の値 4 を保持する動的値です。
  • 動的リテラルまたはその他のリテラルの配列: [ ListOfValues ]。 例えば、 dynamic([1, 2, "hello"]) は、3 つのエレメント (2 つの long 値と 1 つの string 値) からなる動的配列です。
  • プロパティー・バッグ: { 名前 = ... }。 例えば、 dynamic({"a":1, "b":{"a":2}}) は、2 つのスロット abを持つプロパティー・バッグで、2 番目のスロットは別のプロパティー・バッグです。
print o=dynamic({"a":123, "b":"hello", "c":[1,2,3], "d":{}})
| extend a=o.a, b=o.b, c=o.c, d=o.d

便宜上、照会テキスト自体に現れる dynamic リテラルには、 datetimetimespanreallongguidbool、および dynamicタイプの他のクスト・リテラルも含めることができます。 JSON に対するこの拡張は、ストリングの構文解析 ( parse_json 関数の使用時やデータの取り込み時など) には使用できませんが、以下の操作を行うことができます。

print d=dynamic({"a": datetime(1970-05-11)})

JSON エンコード・ルールに従う string 値を解析して dynamic 値にするには、 parse_json 関数を使用します。 例:

  • parse_json('[43, 21, 65]') -数値の配列
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') -辞書
  • parse_json('21') -数値を含む動的タイプの単一値
  • parse_json('"21"') -ストリングを含む動的タイプの単一値
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') -上記の例の o と同じ値を指定します。

注。

JavaScriptとは異なり、JSON では、ストリングとプロパティー・バッグのプロパティー名の前後に二重引用符 ( ") 文字を使用する必要があります。 したがって、通常は、単一引用符 (') 文字を使用して JSON エンコード・ストリング・リテラルを引用符で囲む方が簡単です。

以下の例は、 dynamic 列 (および datetime 列) を保持する表を定義し、それに単一のレコードを取り込む方法を示しています。 また、CSV ファイルで JSON ストリングをエンコードする方法も示しています。

// dynamic is just like any other type:
.create table Logs (Timestamp:datetime, Trace:dynamic)

// Everything between the "[" and "]" is parsed as a CSV line would be:
// 1. Since the JSON string includes double-quotes and commas (two characters
//    that have a special meaning in CSV), we must CSV-quote the entire second field.
// 2. CSV-quoting means adding double-quotes (") at the immediate beginning and end
//    of the field (no spaces allowed before the first double-quote or after the second
//    double-quote!)
// 3. CSV-quoting also means doubling-up every instance of a double-quotes within
//    the contents.
.ingest inline into table Logs
  [2015-01-01,"{""EventType"":""Demo"", ""EventValue"":""Double-quote love!""}"]

結果

タイムスタンプ トレース
2015 年 -01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}

動的オブジェクト・アクセサー

辞書に添字を付けるには、ドット表記 (dict.key) または大括弧表記 (dict["key"]) のいずれかを使用します。 添え字がストリング定数の場合、どちらのオプションも同等です。

添え字として式を使用するには、大括弧表記を使用します。 算術式を使用する場合は、括弧内の式を括弧で囲む必要があります。

以下の例では、 dict および arr は動的タイプの列です。

アクセサー式タイプ 意味 コメント
dict [col] エンティティー名 (列) col の値をキーとして使用して、辞書に添え字を付けます。 列のタイプはストリングでなければなりません
arr [索引] エンティティー索引 (列) 索引として列 index の値を使用して、配列に添え字を付けます。 列は整数型またはブール型でなければなりません
arr [-index] エンティティー索引 (列) 配列の末尾から 'index' 番目の値を取得します。 列は整数型またはブール型でなければなりません
arr [(-1)] エンティティー索引 配列の最後の値を取得します。
arr [toint (indexAsストリング)] 関数呼び出し indexAsString の値を int にキャストし、それらの値を配列の添え字として使用します。
dict [['where']] エンティティー名 (列) として使用されるキーワード where の値をキーとして使用して、辞書に添え字を付けます。 一部の照会言語キーワードと同一のエンティティー名は引用符で囲む必要があります
dict. ['where'] または dict ['where'] 定数 where ストリングをキーとして使用して、辞書に添え字を付けます。

パフォーマンスのヒント:

可能な場合は定数添え字を使用する

dynamic 値のサブオブジェクトにアクセスすると、サブオブジェクトの基礎となるタイプが異なっていても、別の dynamic 値が生成されます。 gettype 関数を使用して、値の実際の基礎となる型を検出し、以下にリストされている cast 関数のいずれかを使用して、それを実際の型にキャストします。

動的オブジェクトのキャスト

動的オブジェクトの添え字付けの後、値を単純タイプにキャストする必要があります。

タイプ
X parse_json ('[100,101,102]') アレイ
X [0] parse_json ('100') ダイナミック
TOINT (X [1]) 101 int
Y parse_json ('{"a1":100, "a b c":"2015-01-01"}') 辞書
Y.a1 parse_json ('100') ダイナミック
Y ["A B C"] parse_json ("2015 -01-01") ダイナミック
累計 (Y ["a b c"]) 日時 (2015 -01-01) 日時

キャスト関数は以下のとおりです。

  • tolong()
  • todouble()
  • todatetime()
  • totimespan()
  • tostring()
  • toguid()
  • todynamic()

動的オブジェクトのビルド

いくつかの関数を使用して、新しい dynamic オブジェクトを作成できます。

  • zip () は、2 つの配列の「並列」値を単一の配列にペア化します。

さらに、集約値を保持する dynamic 配列を作成する集約関数がいくつかあります。

  • make_list () は、すべての値を順番に保持する配列を戻します。
  • make_list_if () は、すべての値をシーケンス (述部付き) で保持する配列を戻します。
  • make_list_with_nulls () は、NULL 値を含むすべての値を順番に保持する配列を返します。
  • make_set () は、すべての固有値を保持する配列を戻します。
  • make_set_if () は、すべての固有値 (述部を含む) を保持する配列を戻します。

動的タイプに対する演算子および関数

スカラー動的/配列関数の完全なリストについては、 動的/配列関数を参照してください。

演算子または関数 動的データ型での使用法
value in 配列 array のエレメントが存在する場合は true == value
where City in ('London', 'Paris', 'Rome')
value !in 配列 array のエレメントが存在しない場合は true == value
array_length(配列) 配列でない場合は NULL
bag_keys(バッグ) 動的プロパティー・バッグ・オブジェクト内のすべてのルート・キーを列挙します。
bag_merge(bag1,...,bagN) 動的プロパティー・バッグを動的プロパティー・バッグにマージし、すべてのプロパティーをマージします。
extractjson(パス、オブジェクト) パスを使用してオブジェクトにナビゲートします。
parse_json(ソース) JSON ストリングを動的オブジェクトに変換します。
range(開始、終了、ステップ) 値の配列
mv-expand listColumn 指定されたセル内のリストの値ごとに行を複製します。
summarize buildschema() 列の内容からタイプ・スキーマを推論します
summarize make_bag() キーを重複させずに、列内のプロパティー・バッグ (辞書) 値を 1 つのプロパティー・バッグにマージします。
summarize make_bag_if(列、述部) 列内のプロパティー・バッグ (辞書) 値を 1 つのプロパティー・バッグにマージします。キーの重複はありません (述部を使用)。
summarize make_list() 行のグループをフラット化し、列の値を配列に入れます。
summarize make_list_if(列、述部) 行のグループをフラット化し、列の値を (述部を使用して) 配列に入れます。
summarize make_list_with_nulls() 行のグループをフラット化し、列の値 (NULL 値を含む) を配列に入れます。
summarize make_set() 行のグループをフラット化し、重複せずに列の値を配列に入れます。

動的データの索引付け

すべてのフィールドは、データ取り込み中に索引付けされます。 索引の有効範囲は、単一のデータ・シャードです。

動的列に索引を付けるために、取り込みプロセスは動的値 (プロパティー名、値、配列エレメント) 内のすべての「アトミック」エレメントを列挙し、それらを索引ビルダーに転送します。 それ以外の場合、動的フィールドは、ストリング・フィールドと同じ反転用語索引を持ちます。