共用方式為


動態數據類型

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

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

  • 值的陣列 dynamic ,包含以零為基底索引的零個或多個值。
  • 將唯 string 一值對應至 dynamic 值的屬性包。 屬性包具有零個或多個這類對應(稱為「位置」),由唯 string 一值編製索引。 位置未排序。
  • 任何基本純量資料類型的值:bool、、、datetimeguidlongintreal、、 stringtimespan
  • 零。 如需詳細資訊,請參閱 Null 值

注意

  • 類型的 dynamic 值限製為 1MB(2^20),未壓縮。 如果記錄中的數據格值超過 1MB,則會卸載值並擷取成功。 您可以變更資料列的編碼原則來增加MaxValueSize資料列的 。
  • dynamic雖然類型看起來類似 JSON,但它可以保存 JSON 模型不代表的值,因為它們不存在於 JSON 中(例如 longrealdatetimetimespanguid)。 因此,將值串行化 dynamic 為 JSON 表示法時,JSON 無法表示的值會串行化為 string 值。 相反地,如果可以剖析字串,Kusto 會將字串剖析為強型別值。 這適用於datetimereallong、 和 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 數位來保存匯總值:

動態類型的運算子和函式

如需純量動態/陣列函式的完整清單,請參閱 動態/陣列函式

運算子或函式 動態數據類型的使用方式
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 常值:datetimetimespanreallong、、、 guidbooldynamic。 剖析字串時(例如使用 parse_json 函式或擷取數據時),無法使用此 JSON 延伸模組,但可讓您執行下列動作:

print d=dynamic({"a": datetime(1970-05-11)})

若要將遵循 JSON 編碼規則的值剖析 stringdynamic 值,請使用 函式 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!”}