動態資料類型

dynamic純量資料類型可以是下列任何值:

  • dynamic 值的陣列,保有零個或多個具有以零為起始索引的值。
  • 可將唯一 string 值對應至 dynamic 值的屬性包。 屬性包有零個或多個這類對應 (稱為「位置」),依唯一的 string 值編制索引。 位置並未排序。
  • 任何基本純量資料類型的值:booldatetimeguidintlongrealstringtimespan
  • Null。 如需詳細資訊,請參閱 Null 值

注意

  • 類型的 dynamic 值限制為 1MB (2^20) ,未壓縮。 如果記錄中的數據格值超過 1MB,則會卸除此值,並成功擷取。 您可以藉由變更資料列的編碼原則來增加MaxValueSize資料列的 。
  • 雖然此dynamic類型看起來類似 JSON,但它可以保存 JSON 模型不代表的值,因為它們不存在於 JSON (例如longreal、、 datetimetimespanguid) 。 因此,在將 dynamic 值序列化為 JSON 表示法時,JSON 無法表示的值會序列化為 string 值。 相反地,Kusto 會將字串剖析為強型別值 (如果可以剖析的話)。 這適用於datetimereallong、 和 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"])。 當註標是字串常數時,這兩個選項相等。

注意

若要使用運算式作為註標,請使用方括號標記法。 使用算術運算式時,方括號內的運算式必須以括弧括住。

在下列範例中,dictarr 是動態類型的資料行:

運算式 存取子運算式類型 意義 註解
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 常值:datetimetimespanreallongguidbooldynamic。 剖析字串時 (例如使用 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!"}