Jenis data dinamis

Jenis dynamic data skalar dapat berupa salah satu nilai berikut:

  • 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.
  • Nilai dari salah satu jenis data skalar primitif: bool, datetime, guid, int, long, real, string, dan timespan.
  • Null. Untuk informasi selengkapnya, lihat Nilai kosong.

Catatan

  • Nilai jenis dynamic dibatasi hingga 1MB (2^20), tidak terkompresi. Jika nilai sel dalam rekaman melebihi 1MB, nilai dihilangkan dan penyerapan berhasil. Anda dapat meningkatkan MaxValueSize kolom dengan mengubah kebijakan pengodeannya.
  • Meskipun jenisnya dynamic tampak seperti JSON, jenis ini dapat menyimpan nilai yang tidak diwakili 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 datetimejenis , 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

Untuk menentukan dynamic harfiah, gunakan salah satu opsi sintaks berikut:

Sintaks Deskripsi Contoh
dynamic([nilai [, ...]]) Array literal dinamis atau skalar lainnya. dynamic([1, 2, "hello"])
dynamic({Kunci=nilai [, ...]}) Tas properti, atau objek. Nilai untuk kunci dapat menjadi tas properti berlapis. dynamic({"a":1, "b":{"a":2}})
dynamic(value) Nilai dinamis yang menyimpan nilai jenis data skalar dalam. dynamic(4)
dynamic(null) Mewakili nilai null.

Pelajari selengkapnya tentang konvensi sintaksis.

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

Tip

Sebaiknya gunakan subskrip 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') dynamic
toint(X[1]) 101 int
Y parse_json('{"a1":100, "a b c":"2015-01-01"}') dictionary
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

Fungsi transmisi adalah:

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

Membuat objek dinamis

Beberapa fungsi memungkinkan Anda membuat objek dynamic baru:

  • bag_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 array yang == nilai
where City in ('London', 'Paris', 'Rome')
value!inarray True jika tidak ada elemen array yang == nilai
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.
bag_set_key(bag,key,value) Menetapkan kunci tertentu ke nilai tertentu dalam tas properti dinamis.
extract_json(path,object), extract_json(path,object) Gunakan jalur untuk menavigasi ke objek.
parse_json(source) Mengubah string JSON menjadi objek dinamis.
range(from,to,step) Array 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.

Contoh

Tas properti dinamis

Kueri berikut membuat tas properti dinamis.

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 memerlukan penggunaan karakter tanda kutip ganda (") di sekitar string dan nama properti property-bag. Oleh karena itu, umumnya lebih mudah untuk mengutip string yang dikodekan JSON secara literal dengan menggunakan karakter tanda kutip tunggal (').

Menyerap data ke dalam kolom dinamis

Contoh berikut menunjukkan bagaimana Anda bisa menentukan tabel yang menyimpan dynamic kolom (serta datetime kolom) lalu menyerap satu rekaman ke dalamnya. Ini juga menunjukkan bagaimana Anda dapat mengodekan 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!""}"]

Output

Tanda waktu Jejak
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}