動態資料類型
dynamic
純量資料類型可以是下列任何值:
dynamic
值的陣列,保有零個或多個具有以零為起始索引的值。- 可將唯一
string
值對應至dynamic
值的屬性包。 屬性包有零個或多個這類對應 (稱為「位置」),依唯一的string
值編制索引。 位置並未排序。 - 任何基本純量資料類型的值:
bool
、datetime
、guid
、int
、long
、real
、string
和timespan
。 - Null。 如需詳細資訊,請參閱 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({ 關鍵= value [, ...]}) |
屬性包或物件。 索引鍵的值可以是巢狀屬性包。 | 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' 個值 | 資料行的類型必須是整數或布林值 |
arr[(-1)] | 實體索引 | 擷取陣列中的最後一個值 | |
arr[toint(indexAsString)] | 函式呼叫 | 將資料行 indexAsString 的值轉換成 int,並將其用於替陣列加上註標 |
|
dict[['where']] | 當作實體名稱 (資料行) 使用的關鍵字 | 使用資料行 where 的值作為索引鍵以字典加上註標 |
與某些查詢語言關鍵字相同的實體名稱必須加上引號 |
dict.['where'] or dict['where'] | 常數 | 使用 where 字串作為索引鍵以替字典加上註標 |
提示
建議您盡可能使用常數下標。
存取 dynamic
值的子物件會產生另一個 dynamic
值,即使子物件具有不同的基礎類型亦然。 使用 gettype
函式來探索值的實際基礎類型,以及使用下面所列的任何轉換函數將其轉換為實際類型。
轉換動態物件
替動態物件加上註標之後,您必須將值轉換成簡單類型。
運算式 | 值 | 類型 |
---|---|---|
X | parse_json('[100,101,102]') | array |
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 |
Cast 函數包括:
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() 會傳回保有所有唯一值的陣列 (使用述詞)。
動態類型的運算子和函式
如需純量動態/陣列函式的完整清單,請參閱動態/陣列函式。
運算子或函式 | 搭配動態資料類型的使用方式 |
---|---|
valuearray | 如果陣列有 == 值的專案,則為 True where City in ('London', 'Paris', 'Rome') |
valuearray | 如果陣列沒有 == 值的專案,則為 True |
array) |
如果不是陣列則為 null |
bag_has_key( 包, 鍵) |
檢查動態包數據行是否包含指定的索引鍵。 |
bag) |
列舉動態屬性包物件中的所有根索引鍵。 |
bag1,...,bagN) |
將多個動態屬性包合併為一個已合併所有屬性的動態屬性包。 |
bag_set_key( bag,key,value) |
將指定的索引鍵設定為動態屬性包中的指定值。 |
extract_json (path,object) ,path,object extract_json( ) |
使用路徑來巡覽至物件。 |
source) |
將 JSON 字串變成動態物件。 |
from,to,step) |
值的陣列。 |
listColumn | 在指定資料格中複寫清單中每個值的資料列。 |
直條圖) |
從數據行內容推斷型別架構。 |
直條圖) |
將資料行中的屬性包 (字典) 值合併為一個屬性包,而不需要複製索引鍵。 |
column,predicate) |
將資料行中的屬性包(字典)值合併為一個屬性包中,而不需要複製索引鍵 (使用述詞)。 |
column) |
將資料列群組壓平合併,並將資料行的值放在陣列中。 |
column,predicate) |
將資料列群組壓平合併,並將資料行的值放在陣列中 (使用述詞)。 |
column) |
將資料列群組壓平合併,並將資料行的值放在陣列中 (包括 null 值)。 |
直條圖) |
將資料列群組壓平合併,並將資料行的值放在陣列中,但不重複。 |
動態資料的索引
在資料擷取期間,每個欄位都會編制索引。 索引的範圍是單一資料分區。
為編制動態資料行的索引,擷取流程會列舉動態值所有的「不可部分完成」元素 (屬性名稱、值、陣列元素),並轉接至索引建立器。 否則,動態欄位有與字串欄位相同的反向字詞索引。
範例
動態屬性包
下列查詢會建立動態屬性包。
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!"} |
相關內容
- 如需如何使用動態物件和物件存取子進行查詢的範例,請參閱 將值從一個集合對應到另一個集合。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應