動的なデータ型

dynamicスカラー データ型には、次のいずれかの値を指定できます。

  • 0 から始まるインデックスを持つ、0 以上の値が保持される dynamic 値の配列。
  • 一意の string 値を dynamic 値にマップするプロパティ バッグ。 プロパティ バッグには、一意の string 値によってインデックス付けされたこのようなマッピング ("スロット" と呼ばれる) が 0 以上あります。 スロットは順序付けられていません。
  • プリミティブ スカラー データ型の任意の値: booldatetimeguidintlongrealstring、および timespan
  • Null。 詳細については、「null 値の」を参照してください。

Note

  • dynamic 型の値は、非圧縮の 1 MB (2^20) に制限されます。 レコード内のセル値が 1 MB を超えると、値が削除され、取り込みが成功します。 列の MaxValueSize を増やすには、列の のポリシーを変更します
  • dynamic型は JSON に似ていますが、JSON に存在しないため JSON モデルが表さない値を保持できます (たとえば、longrealdatetimetimespanguid)。 したがって、dynamic 値を JSON 表現にシリアル化する場合、JSON によって表すことができない値が string 値にシリアル化されます。 逆に、Kusto では、文字列は厳密に型指定された値として解析されます (そのように解析できる場合)。 これは、 datetimereallong、および guid の型に適用されます。 JSON オブジェクト モデルの詳細については、 json.orgを参照してください。
  • Kusto では、プロパティ バッグ内での名前と値のマッピングの順序の維持が試みられません。そのため、順序が維持されることを前提にはできません。 同じマッピング セットを持つ 2 つのプロパティ バッグでは、たとえば string 値として表されるときに、異なる結果が生成される可能性があります。

動的リテラル

dynamicリテラルを指定するには、次のいずれかの構文オプションを使用します。

構文 説明
dynamic([value [, ...]]) 動的または他のスカラー リテラルの配列。 dynamic([1, 2, "hello"])
dynamic({key = value [, ...]}) プロパティ バッグまたはオブジェクト。 キーの値には、入れ子になったプロパティ バッグを指定できます。 dynamic({"a":1, "b":{"a":2}})
dynamic(value) 内部スカラー データ型の値を保持する動的な値。 dynamic(4)
dynamic(null) null 値を表します。

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

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

ディクショナリを添字で指定するには、ドット表記 (dict.key) または角かっこ表記 (dict["key"]) のいずれかを使用します。 添字が文字列定数の場合は、どちらのオプションも同等になります。

Note

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

次の例では、dictarr は動的な型の列です。

Expression アクセサー式の型 意味 Comments
dict[col] エンティティ名 (列) キーとして col 列の値を使用して、ディクショナリを添字で指定する 列は文字列型である必要があります
arr[index] エンティティ インデックス (列) インデックスとして index 列の値を使用して配列を添字で指定します 列は、整数型またはブール型である必要があります
arr[-index] エンティティ インデックス (列) 配列の末尾から "インデックス" の位置の値を取得します 列は、整数型またはブール型である必要があります
arr[(-1)] エンティティ インデックス 配列内の最後の値を取得します
arr[toint(indexAsString)] 関数呼び出し indexAsString の値を int にキャストし、それを使用して配列を添字で指定します
dict[['where']] エンティティ名として使用されるキーワード (列) キーとして where 列の値を使用して、ディクショナリを添字で指定します 一部のクエリ言語キーワードと同一のエンティティ名は、引用符で囲む必要があります
dict.['where'] または dict['where'] 定数 キーとして where 文字列を使用してディクショナリを添字で指定します

ヒント

可能な場合は、定数添字を使用することをお勧めします。

dynamic 値のサブオブジェクトにアクセスすると、サブオブジェクトの基になる型が異なる場合でも、もう 1 つの dynamic 値が生成されます。 gettype 関数を使用して実際に値の基になっている型を検出し、以下の一覧にあるいずれかのキャスト関数によって実際の型にキャストします。

動的オブジェクトをキャストする

動的オブジェクトを添字で指定した後に、値を単純な型にキャストする必要があります。

Expression Type
x parse_json('[100,101,102]') 配列
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
parse_json('{"a1":100, "a b c":"2015-01-01"}') ディクショナリ
Y.a1 parse_json('100') dynamic
Y["a b c"] parse_json("2015-01-01") dynamic
todate(Y["a b c"]) datetime(2015-01-01) datetime

CAST 関数は次のとおりです。

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

動的オブジェクトをビルドする

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

  • bag_pack() は、名前と値のペアからプロパティ バッグを作成します。
  • pack_array() は、値のリストから配列を作成します (列のリストを指定できます。各行に対して、指定した列から配列を作成します)。
  • range() は、一連の算術数値を含む配列を作成します。
  • zip() は、2 つの配列から "並列" の値を組み合わせて、1 つの配列にします。
  • repeat() は、繰り返し値を持つ配列を作成します。

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

  • buildschema() は、複数の dynamic 値の集計スキーマを返します。
  • make_bag() は、グループ内の動的な値のプロパティ バッグを返します。
  • make_bag_if() は、グループ内の動的な値のプロパティ バッグを (述語を使用して) 返します。
  • make_list() は、すべての値を保持する配列を順番に返します。
  • make_list_if() は、すべての値を保持する配列を (述語を使用して) 順番に返します。
  • make_list_with_nulls() は、すべての値を保持する配列 (null 値を含む) を順番に返します。
  • make_set() は、すべての一意の値を保持する配列を返します。
  • make_set_if() は、すべての一意の値を保持する配列を (述語を使用して) 返します。

動的な型に対する演算子と関数

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

演算子または関数 動的データ型の使用方法
value in array true の場合、== valuearray の要素があります
where City in ('London', 'Paris', 'Rome')
value !in array true の場合、== valuearray の要素がありません
array_length(array) 配列でない場合は null。
bag_has_key(bag,key) 動的なバッグの列に指定したキーが含まれているかどうかを確認します。
bag_keys(bag) 動的プロパティ バッグ オブジェクト内のすべてのルート キーを列挙します。
bag_merge(bag1,...,bagN) 動的プロパティ バッグを、すべてのプロパティがマージされた動的プロパティ バッグにマージします。
bag_set_key(bag,key,value) 指定されたキーを動的プロパティ バッグ内の特定の値に設定します。
extract_json(path,object), extract_json(path,object) パスを使用してオブジェクトに移動します。
parse_json(ソース) JSON 文字列を動的オブジェクトに変換します。
range(from,to,step) 値の配列。
mv-expand listColumn リスト内の指定されたセルの各値に対して、行を複製します。
summarize buildschema(column) 列の内容から型スキーマを推論します。
summarize make_bag(column) 列内のプロパティ バッグ (ディクショナリ) 値を、キーの重複なしで、1 つのプロパティ バッグにマージします。
summarize make_bag_if(column,predicate) 列内のプロパティ バッグ (ディクショナリ) 値を、キーの重複なしで (述語を使用して)、1 つのプロパティ バッグにマージします。
summarize make_list(column) 行のグループをフラット化し、列の値を配列に格納します。
summarize make_list_if(column,predicate) 行のグループをフラット化し、配列に列の値を (述語を使用して) 格納します。
summarize make_list_with_nulls(column) 行のグループをフラット化し、null 値を含め、配列に列の値を格納します。
summarize make_set(column) 行のグループをフラット化し、列の値を重複しないように配列に格納します。

動的データのインデックス作成

データの取り込み中に、すべてのフィールドにインデックスが作成されます。 インデックスのスコープは、個々のデータ シャードです。

動的な列にインデックスを付けるために、インジェストプロセスで、動的な値に含まれる"アトミック"な要素(プロパティ名、値、配列要素)がすべて列挙されてインデックス ビルダーに転送されます。 それ以外には、動的フィールドには、文字列フィールドと同じ逆引きの語句インデックスが作成されます。

動的プロパティ バッグ

次のクエリでは、動的プロパティ バッグが作成されます。

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 型を持つ他の Kusto リテラルが含まれる場合もあります。 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と同じ値を指定します。

Note

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!""}"]

出力

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