動態數據類型
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
純 dynamic
量資料類型可以是下列任何值:
- 值的陣列
dynamic
,包含以零為基底索引的零個或多個值。 - 將唯
string
一值對應至dynamic
值的屬性包。 屬性包具有零個或多個這類對應(稱為「位置」),由唯string
一值編製索引。 位置未排序。 - 任何基本純量資料類型的值:
bool
、、、datetime
、guid
、long
int
、real
、、string
和timespan
。 - 零。 如需詳細資訊,請參閱 Null 值。
注意
- 類型的
dynamic
值限製為 1MB(2^20),未壓縮。 如果記錄中的數據格值超過 1MB,則會卸載值並擷取成功。 您可以變更資料列的編碼原則來增加MaxValueSize
資料列的 。 dynamic
雖然類型看起來類似 JSON,但它可以保存 JSON 模型不代表的值,因為它們不存在於 JSON 中(例如long
、real
、datetime
、timespan
和guid
)。 因此,將值串行化dynamic
為 JSON 表示法時,JSON 無法表示的值會串行化為string
值。 相反地,如果可以剖析字串,Kusto 會將字串剖析為強型別值。 這適用於datetime
、real
long
、 和guid
類型。 如需 JSON 物件模型的詳細資訊,請參閱 json.org。- Kusto 不會嘗試在屬性包中保留名稱對值對應的順序,因此您無法假設要保留的順序。 例如,兩個具有相同對應集的屬性包,在以值表示
string
時產生不同的結果是完全可能的。
動態常值
若要指定 dynamic
常值,請使用下列其中一個語法選項:
語法 | 描述 | 範例 |
---|---|---|
dynamic([ value [, ...]]) |
動態或其他純量常值陣列。 | dynamic([1, 2, "hello"]) |
dynamic({ 索引鍵 = 值 [, ...]}) |
屬性包或物件。 索引鍵的值可以是巢狀屬性包。 | dynamic({"a":1, "b":{"a":2}}) |
dynamic( value) |
保存內部純量數據類型值的動態值。 | dynamic(4) |
dynamic(null) |
表示 Null 值。 |
深入瞭解 語法慣例。
動態物件存取子
若要下標字典,請使用點表示法 (dict.key
) 或括號表示法 (dict["key"]
)。 當下標是字串常數時,這兩個選項都相等。
注意
若要使用表達式做為下標,請使用括弧表示法。 使用算術表達式時,括弧內的表達式必須以括弧括住。
在下列 dict
範例中,和 arr
是動態類型的數據行:
運算式 | 存取子表達式類型 | 意義 | 註解 |
---|---|---|---|
dict[col] | 實體名稱(資料列) | 使用數據行 col 的值做為索引鍵來下標字典 |
數據行必須是字串類型 |
arr[index] | 實體索引 (資料列) | 使用數據行 index 的值做為索引來下標數組 |
數據行的類型必須是整數或布爾值 |
arr[-index] | 實體索引 (資料列) | 從陣列結尾擷取 'index'-th 值 | 數據行的類型必須是整數或布爾值 |
arr[(-1)] | 實體索引 | 擷取陣列中的最後一個值 | |
arr[toint(indexAsString)] | 公式呼叫 | 將數據行 indexAsString 的值轉換成 int,並使用它們來下標數位 |
|
dict[['where']] | 做為實體名稱的關鍵字(資料行) | 使用數據 where 行的值做為索引鍵來下標字典 |
必須加上與某些查詢語言關鍵詞相同的實體名稱 |
dict.['where'] 或 dict['where'] | 常數 | 使用 where 字串做為索引鍵來下標字典 |
提示
建議您盡可能使用常數注標。
存取某個值的子物件 dynamic
會產生另一個 dynamic
值,即使子物件具有不同的基礎類型也一樣。 使用 函 gettype
式來探索值的實際基礎類型,以及下面所列的任何轉換函式,將它轉換成實際類型。
轉換動態物件
在下標動態物件之後,您必須將值轉換成簡單類型。
運算式 | 值 | 類型 |
---|---|---|
X | parse_json('[100,101,102]') | 陣列 |
X[0] | parse_json('100') | dynamic |
toint(X[1]) | 101 | int |
Y | 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 |
轉換函式包括:
tolong()
todouble()
todatetime()
totimespan()
tostring()
toguid()
parse_json()
建置動態物件
數個函式可讓您建立新的 dynamic
物件:
- bag_pack() 會從名稱/值組建立屬性包。
- pack_array() 會從值清單建立數位(可以是數據行清單,針對每個數據列,它會從指定的數據行建立陣列)。
- range() 會建立具有算術數列的陣列。
- zip() 將兩個陣列中的「平行」值配對成單一陣列。
- 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 where City in ('London', 'Paris', 'Rome') |
value !in array |
如果陣列中沒有 == 值的專案,則為 True |
array_length( array) |
如果不是陣列,則為 Null |
bag_has_key( 包, 鍵) |
檢查動態包數據行是否包含指定的索引鍵。 |
bag_keys( 袋) |
列舉動態屬性包物件中的所有根索引鍵。 |
bag_merge( bag1,...,bagN) |
將動態屬性包合併為動態屬性包,並合併所有屬性。 |
bag_set_key( bag,key,value) |
將指定的索引鍵設定為動態屬性包中的指定值。 |
extract_json (path,object), extract_json( path,object) |
使用路徑瀏覽至物件。 |
parse_json( source) |
將 JSON 字串轉換成動態物件。 |
range( from、to、step) |
值的陣列。 |
mv-expand listColumn |
複寫指定儲存格中清單中每個值的數據列。 |
summarize buildschema( column) |
從數據行內容推斷類型架構。 |
summarize make_bag( column) |
將數據行中的屬性包 (dictionary) 值合併成一個屬性包,而不會重複索引鍵。 |
summarize make_bag_if( column,predicate) |
將數據行中的屬性包 (dictionary) 值合併成一個屬性包,而不會重複索引鍵(含述詞)。 |
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
出現在查詢文字本身的常值也可能包含具有類型的其他 Kusto 常值:datetime
、timespan
、real
long
、、、 guid
bool
和 dynamic
。
剖析字串時(例如使用 parse_json
函式或擷取數據時),無法使用此 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!”} |
相關內容
- 如需如何使用動態物件和物件存取子查詢的範例,請參閱 將值從一個集合對應到另一個集合。