動的なデータ型
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
dynamic
スカラー データ型には、次のいずれかの値を指定できます。
- 0 から始まるインデックスを持つ、0 以上の値が保持される
dynamic
値の配列。 - 一意の
string
値をdynamic
値にマップするプロパティ バッグ。 プロパティ バッグには、一意のstring
値によってインデックス付けされたこのようなマッピング ("スロット" と呼ばれる) が 0 以上あります。 スロットは順序付けられていません。 - プリミティブ スカラー データ型の任意の値:
bool
、datetime
、guid
、int
、long
、real
、string
、およびtimespan
。 - Null。 詳細については、「null 値の」を参照してください。
Note
dynamic
型の値は、非圧縮の 1 MB (2^20) に制限されます。 レコード内のセル値が 1 MB を超えると、値が削除され、取り込みが成功します。 列のMaxValueSize
を増やすには、列の のポリシーを変更します。dynamic
型は JSON に似ていますが、JSON に存在しないため JSON モデルが表さない値を保持できます (たとえば、long
、real
、datetime
、timespan
、guid
)。 したがって、dynamic
値を JSON 表現にシリアル化する場合、JSON によって表すことができない値がstring
値にシリアル化されます。 逆に、Kusto では、文字列は厳密に型指定された値として解析されます (そのように解析できる場合)。 これは、datetime
、real
、long
、およびguid
の型に適用されます。 JSON オブジェクト モデルの詳細については、 json.orgを参照してください。- Kusto では、プロパティ バッグ内での名前と値のマッピングの順序の維持が試みられません。そのため、順序が維持されることを前提にはできません。 同じマッピング セットを持つ 2 つのプロパティ バッグでは、たとえば
string
値として表されるときに、異なる結果が生成される可能性があります。
動的リテラル
dynamic
リテラルを指定するには、次のいずれかの構文オプションを使用します。
構文規則について詳しく知る。
動的オブジェクトのアクセサー
ディクショナリを添字で指定するには、ドット表記 (dict.key
) または角かっこ表記 (dict["key"]
) のいずれかを使用します。 添字が文字列定数の場合は、どちらのオプションも同等になります。
Note
式を添字として使用するには、角かっこ表記を使用します。 算術式を使用する場合、角かっこ内の式はかっこで囲む必要があります。
次の例では、dict
と arr
は動的な型の列です。
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
リテラルには、datetime
、timespan
、real
、long
、guid
、bool
、および 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!"} |
関連するコンテンツ
- 動的オブジェクトとオブジェクト アクセサーを使用してクエリを実行する方法の例については、「 セット間の値のマップ」を参照してください。