Jenis data dinamis

Jenis data skalar dynamic bersifat khusus karena dapat mengambil nilai jenis data skalar lainnya dari daftar di bawah ini, serta larik dan tas properti. Secara khusus, dynamic nilai dapat berupa:

  • Null.
  • Nilai dari salah satu jenis data skalar primitif: bool, datetime, guid, int, long, real, string, dan timespan.
  • Larik dari nilai dynamic, memiliki nilai nol atau lebih dengan pengindeksan berbasis nol.
  • Tas properti yang memetakan nilai string yang unik ke nilai dynamic. Tas properti memiliki nol atau beberapa pemetaan seperti itu (disebut "slot"), yang diindeks oleh nilai string yang unik. Slot tersebut tidak berurutan.

Catatan

  • Nilai jenis dynamic dibatasi hingga 1MB (2^20), tidak terkompresi.
  • Meskipun jenis dynamic muncul seperti JSON, jenis tersebut memiliki nilai yang tidak direpresentasikan model JSON karena tidak ada di JSON (misalnya, long, real, datetime, timespan, dan guid). Oleh karena itu, dalam menserialisasi nilai dynamic ke representasi JSON, nilai yang tidak dapat direpresentasikan JSON akan diserialisasi ke nilai string. Sebaliknya, Kusto akan mengurai string sebagai nilai dengan aturan terikat jika dapat diurai sedemikian rupa. Ini berlaku untuk jenis datetime, real, long, dan guid. Untuk informasi selengkapnya tentang model objek JSON, lihat json.org.
  • Kusto tidak berupaya mempertahankan urutan pemetaan nama-ke-nilai dalam tas properti, sehingga Anda tidak dapat mengasumsikan urutan yang akan dipertahankan. Dua tas properti dengan set pemetaan yang sama sangat mungkin menangguhkan hasil yang berbeda ketika tas properti tersebut direpresentasikan sebagai, misalnya, nilai string.

Literal dinamis

Literal jenis dynamic akan terlihat seperti ini:

dynamic(Value)

Nilai dapat berupa:

  • null, dalam kasus ketika literal merepresentasikan nilai dinamis: dynamic(null).
  • Jenis data skalar lain literal, dalam kasus ketika literal merepresentasikan literal dynamic dari jenis "dalam". Misalnya, dynamic(4) adalah nilai dinamis yang memiliki nilai 4 dari jenis data skalar panjang.
  • Larik dinamis atau literal lainnya: [ListOfValues]. Misalnya, dynamic([1, 2, "hello"]) adalah larik dinamis dari tiga elemen, dua nilai long dan satu nilai string.
  • Tas properti: {Name=Value ... }. Misalnya, dynamic({"a":1, "b":{"a":2}}) adalah tas properti dengan dua slot, a, dan b, dengan slot kedua yang menjadi tas properti lain.
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

Untuk kemudahan, literal dynamic yang muncul dalam teks kueri itu sendiri juga dapat menyertakan literal Kusto lainnya dengan jenis: datetime, timespan, real, long, guid, bool, dan dynamic. Ekstensi melalui JSON ini tidak tersedia saat mengurai string (seperti saat menggunakan fungsi parse_json atau saat menyerap data), tetapi memungkinkan Anda melakukan hal berikut:

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

Untuk mengurai nilai string yang mengikuti aturan pengodean JSON menjadi nilai dynamic, gunakan fungsi parse_json. Contohnya:

  • parse_json('[43, 21, 65]') - larik angka
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - kamus
  • parse_json('21') - satu nilai jenis dinamis yang berisi angka
  • parse_json('"21"') - satu nilai jenis dinamis yang berisi string
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') - memberikan nilai yang sama o dalam contoh di atas.

Catatan

Tidak seperti JavaScript, JSON mewajibkan penggunaan karakter tanda kutip ganda (") di sekitar string dan nama properti tas properti. Oleh karena itu, umumnya lebih mudah untuk mengutip string yang dikodekan JSON secara literal dengan menggunakan karakter tanda kutip tunggal (').

Contoh berikut menunjukkan cara menentukan tabel yang memiliki kolom dynamic (serta kolom datetime), lalu menyerap satu catatan ke tabel tersebut. Contoh ini juga menunjukkan cara mengenkode string JSON dalam file CSV:

// 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!""}"]
Tanda waktu Jejak
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}

Pengakses objek dinamis

Untuk memberi tanda pada kamus, gunakan notasi titik (dict.key) atau notasi tanda kurung (dict["key"]). Ketika subskrip adalah konstanta string, kedua opsi tersebut setara.

Catatan

Untuk menggunakan ekspresi sebagai subskrip, gunakan notasi tanda kurung. Saat menggunakan ekspresi aritmetika, ekspresi di dalam tanda kurung harus ditutup dengan tanda kurung.

Dalam contoh di bawah dict dan arr merupakan kolom jenis dinamis:

Ekspresi Jenis ekspresi pengakses Makna Komentar
dict[col] Nama entitas (kolom) Memberi tanda pada kamus menggunakan nilai kolom col sebagai kuncinya Kolom harus berupa string jenis
arr[index] Indeks entitas (kolom) Memberi tanda pada array menggunakan nilai kolom index sebagai indeks Kolom harus dari jenis bilangan bulat atau boolean
arr[-index] Indeks entitas (kolom) Mengambil nilai 'indeks'-th dari akhir larik Kolom harus dari jenis bilangan bulat atau boolean
arr[(-1)] Indeks entitas Mengambil nilai terakhir dalam larik
arr[toint(indexAsString)] Panggilan Fungsi Mentransmisikan nilai kolom indexAsString ke int dan menggunakannya untuk memberi tanda pada larik
dict[['where']] Kata kunci yang digunakan sebagai nama entitas (kolom) Memberi tanda pada kamus menggunakan nilai kolom where sebagai kuncinya Nama entitas yang identik dengan beberapa kata kunci bahasa kueri harus diberi tanda kutip
dict.['where'] atau dict['where'] Terus-menerus Memberi tanda pada kamus menggunakan string where sebagai kuncinya

Tips terkait performa: Coba gunakan subskrip yang konstan jika memungkinkan

Mengakses sub-objek dari nilai dynamic menangguhkan nilai lain dynamic, bahkan jika sub-objek memiliki jenis pokok yang berbeda. Gunakan fungsi gettypeuntuk menemukan jenis pokok sebenarnya dari nilai, dan fungsi transmisi yang dicantumkan di bawah untuk mentransmisikan nilai ke jenis sebenarnya.

Mentransmisikan objek dinamis

Setelah memberi tanda pada objek dinamis, Anda harus mentransmisikan nilai ke jenis yang simpel.

Ekspresi Nilai Jenis
X parse_json('[100,101,102]') array
X[0] parse_json('100') dinamis
toint(X[1]) 101 int
Y parse_json('{"a1":100, "a b c":"2015-01-01"}') dictionary
Y.a1 parse_json('100') dinamis
Y["a b c"] parse_json("2015-01-01") dinamis
todate(Y["a b c"]) datetime(2015-01-01) datetime

Fungsi transmisi adalah:

  • tolong()
  • todouble()
  • todatetime()
  • totimespan()
  • tostring()
  • toguid()
  • todynamic()

Membuat objek dinamis

Beberapa fungsi memungkinkan Anda membuat objek dynamic baru:

  • pack() membuat tas properti dari pasangan nama/nilai.
  • pack_array() membuat larik dari pasangan nama/nilai.
  • range() membuat larik dengan deretan angka aritmetika.
  • zip() memasangkan nilai "paralel" dari dua larik ke satu larik.
  • repeat() membuat larik dengan nilai berulang.

Selain itu, ada beberapa fungsi agregat yang membuat larik dynamic menyimpan nilai agregat:

  • buildschema() menampilkan skema agregat dari beberapa nilai dynamic.
  • make_bag() menampilkan tas properti dari nilai dinamis dalam grup.
  • make_bag_if() menampilkan tas properti dari nilai dinamis dalam grup (dengan predikat).
  • make_list() menampilkan larik yang memiliki semua nilai,secara berurutan.
  • make_list_if() menampilkan larik yang memiliki semua nilai, secara berurutan (dengan predikat).
  • make_list_with_nulls() menampilkan larik yang memiliki semua nilai, secara berurutan, termasuk nilai null.
  • make_set() menampilkan larik yang memiliki semua nilai unik.
  • make_set_if() menampilkan larik yang memiliki semua nilai unik (dengan predikat).

Operator dan fungsi, bukan jenis dinamis

Untuk daftar lengkap fungsi larik/,dinamis skalar lihat fungsi dinamis/larik.

Operator atau fungsi Penggunaan dengan jenis data dinamis
valueinarray True jika ada elemen dari array that == value
where City in ('London', 'Paris', 'Rome')
value!inarray True jika tidak ada elemen dari array that == value
Array) Null jika bukan larik
bag_has_key(bag,key) Periksa apakah kolom bag dinamis berisi kunci tertentu.
bag_keys(bag) Menghitung semua kunci root dalam objek tas properti dinamis.
bag_merge(bag1,...,bagN) Menggabungkan tas properti dinamis ke dalam tas properti dinamis yang memiliki semua properti digabungkan.
extractjson(path,object) Menggunakan jalur untuk mengarahkan objek.
parse_json(source) Mengubah string JSON menjadi objek dinamis.
range(from,to,step) Larik nilai
mv-expand listColumn Mereplikasi baris untuk setiap nilai dalam daftar pada sel tertentu.
summarize buildschema(column) Menyimpulkan skema jenis dari konten kolom
summarize make_bag(kolom) Menggabungkan nilai tas properti (kamus) dalam kolom menjadi satu tas properti, tanpa duplikasi kunci.
summarize make_bag_if(column,predicate) Menggabungkan nilai tas properti (kamus) di kolom menjadi satu tas properti, tanpa duplikasi kunci (dengan predikat).
summarize make_list(column) Menyelaraskan kumpulan baris dan menempatkan nilai kolom dalam larik.
summarize make_list_if(column,predicate) Menyelaraskan kumpulan baris dan menempatkan nilai kolom dalam larik (dengan predikat).
summarize make_list_with_nulls(column) Menyelaraskan kumpulan baris dan menempatkan nilai kolom dalam larik, termasuk nilai null.
summarize make_set(column) Menyelaraskan kumpulan baris dan menempatkan nilai kolom dalam larik, tanpa duplikasi.

Pengindeksan untuk data dinamis

Setiap bidang diindeks selama penyerapan data. Cakupan indeks adalah shard data tunggal.

Untuk mengindeks kolom dinamis,proses penyerapan tersebut menghitung semua elemen “kecil” dalam nilai dinamis (nama properti, nilai, elemen larik) dan meneruskannya ke pembuat indeks. Bidang dinamis memiliki indeks istilah terbalik yang sama dengan bidang string.