Menulis kueri untuk Azure Data Explorer

Pada artikel ini, Anda mempelajari cara menggunakan bahasa kueri di Azure Data Explorer untuk melakukan kueri dasar dengan operator yang paling umum. Anda juga mendapatkan eksposur ke beberapa fitur bahasa yang lebih canggih.

Prasyarat

Anda dapat menjalankan kueri dalam artikel ini dengan salah satu dari dua cara:

Gambaran umum bahasa kueri

Kueri di Azure Data Explorer adalah permintaan baca-saja untuk memproses data dan mengembalikan hasil. Permintaan dinyatakan dalam teks biasa, menggunakan model aliran data yang dirancang untuk membuat sintaks mudah dibaca, ditulis, dan diotomatisasi. Kueri menggunakan entitas skema yang diatur dalam hierarki yang mirip dengan SQL: database, tabel, dan kolom.

Kueri terdiri dari urutan pernyataan kueri, dibatasi oleh titik koma (;), dengan setidaknya satu pernyataan menjadi pernyataan ekspresi tabular, yang merupakan pernyataan yang menghasilkan data yang disusun dalam mesh kolom dan baris seperti tabel. Pernyataan ekspresi tabular kueri menghasilkan hasil kueri. Setiap dua pernyataan harus dipisahkan oleh titik koma.

Sintaks pernyataan ekspresi tabular memiliki aliran data tabular dari satu operator kueri tabular ke yang lain, dimulai dengan sumber data (misalnya, tabel dalam database, atau operator yang menghasilkan data) dan kemudian mengalir melalui satu set operator transformasi data yang terikat bersama melalui penggunaan pembatas pipa (|).

Misalnya, kueri berikut memiliki satu pernyataan, yang merupakan pernyataan ekspresi tabular. Pernyataan dimulai dengan referensi ke tabel yang disebut StormEvents (database yang menghosting tabel ini tersirat di sini, dan bagian dari informasi koneksi). Data (baris) untuk tabel tersebut kemudian difilter berdasarkan nilai StartTime kolom, lalu difilter berdasarkan nilai State kolom. Kueri kemudian mengembalikan hitungan baris "bertahan".

[Klik untuk menjalankan kueri]

StormEvents
| where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01)
| where State == "FLORIDA"  
| count

Dalam hal ini, hasilnya adalah:

Count
23

Untuk informasi selengkapnya, lihat referensi bahasa kueri.

Operator yang paling umum

Operator yang tercakup dalam bagian ini adalah blok bangunan untuk memahami kueri di Azure Data Explorer. Sebagian besar pertanyaan yang Anda tulis akan mencakup beberapa operator ini.

Untuk menjalankan kueri pada kluster bantuan: pilih Klik untuk menjalankan kueri di atas setiap kueri.

Untuk menjalankan kueri di kluster Anda sendiri:

  1. Salin setiap kueri ke dalam aplikasi kueri berbasis web, lalu pilih kueri atau letakkan kursor Anda dalam kueri.

  2. Di bagian atas aplikasi, pilih Jalankan.

hitung

jumlah: Mengembalikan jumlah baris dalam tabel.

Kueri berikut mengembalikan jumlah baris dalam tabel StormEvents.

[Klik untuk menjalankan kueri]

StormEvents | count

ambil

ambil: Mengembalikan ke jumlah baris data yang ditentukan.

Kueri berikut mengembalikan lima baris dari tabel StormEvents. Batas kata kunci adalah alias untuk diambil.

[Klik untuk menjalankan kueri]

StormEvents | take 5

Tip

Tidak ada jaminan catatan mana yang dikembalikan kecuali data sumber diurutkan.

proyek

proyek: Memilih subset kolom.

Kueri berikut mengembalikan sekumpulan kolom tertentu.

[Klik untuk menjalankan kueri]

StormEvents
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

Di mana

tempat: Memfilter tabel ke subset baris yang memenuhi predikat.

Kueri berikut memfilter data oleh EventType dan State.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

sort

pengurutan: Urutkan baris tabel input ke dalam urutan berdasarkan satu atau beberapa kolom.

Kueri berikut mengurutkan data dalam urutan menurun menurut DamageProperty.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| sort by DamageProperty desc
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

Catatan

Urutan operasi itu penting. Coba letakkan take 5 sebelumnya sort by. Apakah Anda mendapatkan hasil yang berbeda?

teratas

atas: Mengembalikan catatan N pertama yang diurutkan berdasarkan kolom yang ditentukan.

Kueri berikut mengembalikan hasil yang sama seperti di atas dengan satu operator lebih sedikit.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative

Memperpanjang

perpanjang: Menghitung kolom turunan.

Kueri berikut membuat kolom baru dengan menghitung nilai di setiap baris.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| extend Duration = EndTime - StartTime
| project StartTime, EndTime, Duration, State, EventType, DamageProperty, EpisodeNarrative

Ekspresi dapat mencakup semua operator biasa (+, -, *, /, %), dan ada berbagai fungsi berguna yang dapat Anda panggil.

Meringkas

meringkas: Kumpulan baris agregat.

Kueri berikut mengembalikan jumlah peristiwa dengan State.

[Klik untuk menjalankan kueri]

StormEvents
| summarize event_count = count() by State

Operator meringkas bersama-sama baris yang memiliki nilai yang sama dalam klausa menurut , dan kemudian menggunakan fungsi agregasi (seperti hitungan) untuk menggabungkan setiap kelompok menjadi satu baris. Jadi, dalam hal ini, ada baris untuk setiap negara bagian, dan kolom untuk jumlah baris dalam keadaan itu.

Ada berbagai fungsi agregasi, dan Anda dapat menggunakan beberapa di antaranya dalam satu operator ringkasan untuk menghasilkan beberapa kolom yang dihitung. Misalnya, Anda bisa mendapatkan jumlah badai di setiap negara bagian dan jumlah badai yang unik per negara bagian, lalu gunakan bagian atas untuk mendapatkan negara bagian yang paling terkena dampak badai.

[Klik untuk menjalankan kueri]

StormEvents
| summarize StormCount = count(), TypeOfStorms = dcount(EventType) by State
| top 5 by StormCount desc

Hasil operasi ringkasan memiliki:

  • Setiap kolom yang disebutkan dalam oleh

  • Kolom untuk setiap ekspresi yang dihitung

  • Baris untuk setiap kombinasi berdasarkan nilai

render

render: Merender hasil sebagai output grafis.

Kueri berikut menampilkan bagan kolom.

[Klik untuk menjalankan kueri]

StormEvents
| summarize event_count=count(), mid = avg(BeginLat) by State
| sort by mid
| where event_count > 1800
| project State, event_count
| render columnchart

Kueri berikut menampilkan bagan waktu sederhana.

[Klik untuk menjalankan kueri]

StormEvents
| summarize event_count=count() by bin(StartTime, 1d)
| render timechart

Kueri berikut menghitung peristiwa berdasarkan waktu modulo satu hari, dibuang ke dalam jam, dan menampilkan bagan waktu.

[Klik untuk menjalankan kueri]

StormEvents
| extend hour = floor(StartTime % 1d , 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render timechart

Kueri berikut membandingkan beberapa seri harian pada bagan waktu.

[Klik untuk menjalankan kueri]

StormEvents
| extend hour= floor( StartTime % 1d , 1h)
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render timechart

Catatan

Operator render adalah fitur sisi klien dan bukan bagian dari mesin. Ini diintegrasikan ke dalam bahasa untuk kemudahan penggunaan. Aplikasi web mendukung opsi berikut: barchart, columnchart, piechart, timechart, dan linechart.

Operator skalar

Bagian ini mencakup beberapa operator skalar yang paling penting.

bin()

bin(): Membulatkan nilai ke kelipatan bilangan bulat dari ukuran bin tertentu.

Kueri berikut menghitung hitungan dengan ukuran bucket satu hari.

[Klik untuk menjalankan kueri]

StormEvents
| where StartTime > datetime(2007-02-14) and StartTime < datetime(2007-02-21)
| summarize event_count = count() by bin(StartTime, 1d)

case()

case(): Mengevaluasi daftar predikat, dan mengembalikan ekspresi hasil pertama yang predikatnya puas, atau ekspresi final lainnya . Anda dapat menggunakan operator ini untuk mengkategorikan atau mengelompokkan data:

Kueri berikut mengembalikan kolom deaths_bucket baru dan mengelompokkan kematian berdasarkan angka.

[Klik untuk menjalankan kueri]

StormEvents
| summarize deaths = sum(DeathsDirect) by State
| extend deaths_bucket = case (
    deaths > 50, "large",
    deaths > 10, "medium",
    deaths > 0, "small",
    "N/A")
| sort by State asc

extract()

extract(): Mendapat kecocokan untuk ekspresi reguler dari string teks.

Kueri berikut mengekstrak nilai atribut tertentu dari jejak.

[Klik untuk menjalankan kueri]

let MyData = datatable (Trace: string) ["A=1, B=2, Duration=123.45,...", "A=1, B=5, Duration=55.256, ..."];
MyData
| extend Duration = extract("Duration=([0-9.]+)", 1, Trace, typeof(real)) * time(1s)

Kueri ini menggunakan pernyataan let , yang mengikat nama (dalam hal ini) ke ekspresi. Untuk sisa cakupan, di mana pernyataan let muncul (lingkup global atau dalam lingkup tubuh fungsi), nama dapat digunakan untuk merujuk pada nilai terikatnya.

parse_json()

parse_json(): Menginterpretasikan string sebagai nilai JSON, dan mengembalikan nilai sebagai dinamis. Ini lebih unggul daripada menggunakan fungsi extractjson() ketika Anda perlu mengekstrak lebih dari satu elemen objek JSON majemuk.

Kueri berikut mengekstrak elemen JSON dari array.

[Klik untuk menjalankan kueri]

let MyData = datatable (Trace: string)
['{"duration":[{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}]}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.duration[0].value, NewCol.duration[0].valcount, NewCol.duration[0].min, NewCol.duration[0].max, NewCol.duration[0].stdDev

Kueri berikut mengekstrak elemen JSON.

[Klik untuk menjalankan kueri]

let MyData = datatable (Trace: string) ['{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.value, NewCol.valcount, NewCol.min, NewCol.max, NewCol.stdDev

Kueri berikut mengekstrak elemen JSON dengan tipe data dinamis.

[Klik untuk menjalankan kueri]

let MyData = datatable (Trace: dynamic)
[dynamic({"value":118.0,"counter":5.0,"min":100.0,"max":150.0,"stdDev":0.0})];
MyData
| project Trace.value, Trace.counter, Trace.min, Trace.max, Trace.stdDev

ago()

ago(): Mengurangi rentang waktu yang diberikan dari waktu jam UTC saat ini.

Kueri berikut mengembalikan data selama 12 jam terakhir.

[Klik untuk menjalankan kueri]

//The first two lines generate sample data, and the last line uses
//the ago() operator to get records for last 12 hours.
print TimeStamp= range(now(-5d), now(), 1h), SomeCounter = range(1,121)
| mv-expand TimeStamp, SomeCounter
| where TimeStamp > ago(12h)

startofweek()

startofweek(): Mengembalikan awal minggu yang berisi tanggal, digeser oleh offset, jika disediakan

Kueri berikut mengembalikan awal minggu dengan offset yang berbeda.

[Klik untuk menjalankan kueri]

range offset from -1 to 1 step 1
| project weekStart = startofweek(now(), offset),offset

Kueri ini menggunakan operator rentang , yang menghasilkan tabel nilai satu kolom. Lihat juga: startofday(), startofweek(), startofyear()), startofmonth(), endofday(), endofweek(), endofmonth(), dan endofyear().

antara()

between(): Cocok dengan input yang berada dalam rentang inklusif.

Kueri berikut memfilter data berdasarkan rentang tanggal tertentu.

[Klik untuk menjalankan kueri]

StormEvents
| where StartTime between (datetime(2007-07-27) .. datetime(2007-07-30))
| count

Kueri berikut memfilter data berdasarkan rentang tanggal tertentu, dengan sedikit variasi tiga hari (3d) dari tanggal mulai.

[Klik untuk menjalankan kueri]

StormEvents
| where StartTime between (datetime(2007-07-27) .. 3d)
| count

Operator tabular

Kusto memiliki banyak operator tabular, beberapa di antaranya tercakup dalam bagian lain dari artikel ini. Di sini kita akan fokus pada parse.

Mengurai

parse: Mengevaluasi ekspresi string dan mengurai nilainya menjadi satu atau beberapa kolom terhitung. Ada tiga cara untuk mengurai: sederhana (default), regex, dan santai.

Kueri berikut mengurai jejak dan mengekstrak nilai yang relevan, menggunakan default penguraian sederhana. Ekspresi (disebut sebagai StringConstant) adalah nilai string reguler dan kecocokannya ketat: kolom yang diperluas harus sesuai dengan jenis yang diperlukan.

[Klik untuk menjalankan kueri]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse EventTrace with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previouLockTime:date ")" *  
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previouLockTime

Kueri berikut mengurai jejak dan mengekstrak nilai yang relevan, menggunakan kind = regex. StringConstant bisa menjadi ekspresi biasa.

[Klik untuk menjalankan kueri]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind = regex EventTrace with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber:long  ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime:date "\\)"  
| project resourceName , sliceNumber , lockTime , releaseTime , previousLockTime

Kueri berikut mengurai jejak dan mengekstrak nilai yang relevan, menggunakan kind = relaxed. StringConstant adalah nilai string biasa dan kecocokan dilonggarkan: kolom yang diperpanjang sebagian dapat cocok dengan jenis yang diperlukan.

[Klik untuk menjalankan kueri]

let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind=relaxed "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=NULL, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=NULL, previousLockTime=02/17/2016 08:39:01)" with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *  
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previousLockTime

Analisis deret waktu

make-series

make-series: agregat bersama-sama kelompok baris seperti meringkas, tetapi menghasilkan (waktu) vektor seri per setiap kombinasi oleh nilai.

Kueri berikut mengembalikan satu set deret waktu untuk jumlah peristiwa badai per hari. Kueri mencakup periode tiga bulan untuk setiap status, mengisi tempat sampah yang hilang dengan konstanta 0:

[Klik untuk menjalankan kueri]

StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State

Setelah Membuat satu set seri (waktu), Anda dapat menerapkan fungsi seri untuk mendeteksi bentuk anomali, pola musiman, dan banyak lagi.

Kueri berikut mengekstrak tiga status teratas yang memiliki peristiwa terbanyak di hari tertentu:

[Klik untuk menjalankan kueri]

StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
| extend series_stats(n)
| top 3 by series_stats_n_max desc
| render timechart

Untuk informasi lebih lanjut, tinjau daftar lengkap fungsi seri.

Agregasi tingkat lanjut

Kami membahas agregasi dasar, seperti menghitung dan meringkas, sebelumnya dalam artikel ini. Bagian ini memperkenalkan opsi yang lebih maju.

bersarang tinggi

top-nested: Menghasilkan hasil teratas hierarkis, di mana setiap level adalah penelusuran berdasarkan nilai level sebelumnya.

Operator ini berguna untuk skenario visualisasi dasbor, atau ketika perlu untuk menjawab pertanyaan seperti berikut: "Temukan nilai-nilai top-N K1 (menggunakan beberapa agregasi); untuk masing-masing, temukan apa nilai top-M K2 (menggunakan agregasi lain); ..."

Kueri berikut mengembalikan tabel hierarkis dengan State di tingkat atas, diikuti oleh Sources.

[Klik untuk menjalankan kueri]

StormEvents
| top-nested 2 of State by sum(BeginLat),
top-nested 3 of Source by sum(BeginLat),
top-nested 1 of EndLocation by sum(BeginLat)

plugin pivot()

plugin pivot() : Memutar tabel dengan mengubah nilai unik dari satu kolom dalam tabel input menjadi beberapa kolom dalam tabel output. Operator melakukan agregasi di mana mereka diperlukan pada nilai kolom yang tersisa dalam output akhir.

Kueri berikut menerapkan filter dan memutar baris ke dalam kolom.

[Klik untuk menjalankan kueri]

StormEvents
| project State, EventType
| where State startswith "AL"
| where EventType has "Wind"
| evaluate pivot(State)

dcount()

dcount(): Mengembalikan perkiraan jumlah nilai ekspresi yang berbeda dalam grup. Gunakan count() untuk menghitung semua nilai.

Kueri berikut dihitung berbeda dengan SourceState.

[Klik untuk menjalankan kueri]

StormEvents
| summarize Sources = dcount(Source) by State

dcountif()

dcountif(): Mengembalikan perkiraan jumlah nilai ekspresi yang berbeda untuk baris yang dievaluasi predikat menjadi true.

Kueri berikut menghitung nilai yang berbeda dari Source mana DamageProperty < 5000.

[Klik untuk menjalankan kueri]

StormEvents 
| take 100
| summarize Sources = dcountif(Source, DamageProperty < 5000) by State

dcount_hll()

dcount_hll(): Menghitung dcount dari hasil HyperLogLog (dihasilkan oleh hll atau hll_merge.

Kueri berikut menggunakan algoritma HLL untuk menghasilkan hitungan.

[Klik untuk menjalankan kueri]

StormEvents
| summarize hllRes = hll(DamageProperty) by bin(StartTime,10m)
| summarize hllMerged = hll_merge(hllRes)
| project dcount_hll(hllMerged)

arg_max()

arg_max(): Menemukan baris dalam grup yang memaksimalkan ekspresi, dan mengembalikan nilai ekspresi lain (atau * untuk mengembalikan seluruh baris).

Kueri berikut mengembalikan waktu laporan banjir terakhir di setiap negara bagian.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == "Flood"
| summarize arg_max(StartTime, *) by State
| project State, StartTime, EndTime, EventType

makeset()

makeset(): Mengembalikan array dinamis (JSON) dari kumpulan nilai berbeda yang diambil ekspresi dalam grup.

Kueri berikut mengembalikan setiap saat ketika banjir dilaporkan oleh setiap status dan membuat array dari kumpulan nilai yang berbeda.

[Klik untuk menjalankan kueri]

StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports

mv-expand

mv-expand: Memperluas koleksi multi-nilai dari kolom yang diketik dinamis sehingga setiap nilai dalam koleksi mendapat baris terpisah. Semua kolom lain dalam baris yang diperluas diduplikasi. Ini adalah kebalikan dari makelist.

Kueri berikut menghasilkan data sampel dengan membuat satu set dan kemudian menggunakannya untuk menunjukkan kemampuan mv-expand .

[Klik untuk menjalankan kueri]

let FloodDataSet = StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports;
FloodDataSet
| mv-expand FloodReports

persentil()

persentil(): Mengembalikan perkiraan untuk persentil peringkat terdekat yang ditentukan dari populasi yang ditentukan oleh ekspresi. Keakuratan tergantung pada kepadatan penduduk di wilayah persentil. Hanya dapat digunakan dalam konteks agregasi di dalam summarize.

Kueri berikut menghitung persentil untuk durasi badai.

[Klik untuk menjalankan kueri]

StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize percentiles(duration, 5, 20, 50, 80, 95)

Kueri berikut menghitung persentil untuk durasi badai berdasarkan status dan menormalkan data dengan tempat sampah lima menit (5m).

[Klik untuk menjalankan kueri]

StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count() by bin(duration, 5m), State
| summarize percentiles(duration, 5, 20, 50, 80, 95) by State

Himpunan Data Silang

Bagian ini mencakup elemen yang memungkinkan Anda membuat kueri yang lebih kompleks, menggabungkan data di seluruh tabel, dan kueri di seluruh database dan kluster.

biar

let: Meningkatkan modularitas dan penggunaan kembali. Pernyataan let memungkinkan Anda untuk memecah ekspresi yang berpotensi kompleks menjadi beberapa bagian, masing-masing terikat pada nama, dan menyusun bagian-bagian itu bersama-sama. Pernyataan let juga dapat digunakan untuk membuat fungsi dan tampilan yang ditentukan pengguna (ekspresi di atas tabel yang hasilnya terlihat seperti tabel baru). Ekspresi yang terikat oleh pernyataan let dapat berupa tipe skalar, tipe tabular, atau fungsi yang ditentukan pengguna (lambda).

Contoh berikut membuat variabel tipe tabular dan menggunakannya dalam ekspresi berikutnya.

[Klik untuk menjalankan kueri]

let LightningStorms =
StormEvents
| where EventType == "Lightning";
let AvalancheStorms =
StormEvents
| where EventType == "Avalanche";
LightningStorms
| join (AvalancheStorms) on State
| distinct State

gabung

bergabung: Gabungkan baris dua tabel untuk membentuk tabel baru dengan mencocokkan nilai kolom yang ditentukan dari setiap tabel. Kusto mendukung berbagai jenis join: fullouter, inner, innerunique, leftanti, leftantisemi, leftouter, leftsemi, rightanti, rightantisemi, rightouter, rightsemi.

Contoh berikut menggabungkan dua tabel dengan gabungan bagian dalam.

[Klik untuk menjalankan kueri]

let X = datatable(Key:string, Value1:long)
[
    'a',1,
    'b',2,
    'b',3,
    'c',4
];
let Y = datatable(Key:string, Value2:long)
[
    'b',10,
    'c',20,
    'c',30,
    'd',40
];
X 
| join kind=inner Y on Key

Tip

Gunakan di mana dan operator proyek untuk mengurangi jumlah baris dan kolom dalam tabel input, sebelum bergabung. Jika satu tabel selalu lebih kecil dari yang lain, gunakan sebagai sisi kiri (pipa) dari gabungan. Kolom untuk pertandingan gabungan harus memiliki nama yang sama. Gunakan operator proyek jika perlu untuk mengganti nama kolom di salah satu tabel.

serialisasi

serialisasi: Serialisasi set baris sehingga Anda dapat menggunakan fungsi yang memerlukan data serial, seperti row_number().

Kueri berikut berhasil karena data diserialkan.

[Klik untuk menjalankan kueri]

StormEvents
| summarize count() by State
| serialize
| extend row_number = row_number()

Set baris juga dianggap sebagai serial jika merupakan hasil dari: operator sortir, atas, atau jangkauan , secara opsional diikuti oleh proyek, proyek-away, extend, where, parse, mv-expand, atau take operator.

[Klik untuk menjalankan kueri]

StormEvents
| summarize count() by State
| sort by State asc
| extend row_number = row_number()

Kueri lintas database dan lintas kluster

Kueri lintas database dan lintas kluster: Anda dapat meminta database pada kluster yang sama dengan menyebutnya sebagai . Anda dapat mengkueri database pada kluster jarak jauh dengan menyebutnya sebagai cluster("MyCluster").database("MyDatabase").MyTable.

Kueri berikut dipanggil dari satu kluster dan meminta data dari MyCluster kluster. Untuk menjalankan kueri ini, gunakan nama kluster dan nama database Anda sendiri.

cluster("MyCluster").database("Wiki").PageViews
| where Views < 2000
| take 1000;

Analisis Pengguna

Bagian ini mencakup elemen dan kueri yang menunjukkan betapa mudahnya melakukan analisis perilaku pengguna di Kusto.

plugin activity_counts_metrics

activity_counts_metrics plugin: Menghitung metrik aktivitas yang berguna (nilai jumlah total, nilai hitungan yang berbeda, jumlah nilai baru yang berbeda, dan jumlah agregat yang berbeda). Metrik dihitung untuk setiap jendela waktu, kemudian dibandingkan, dan digabungkan ke dan dengan semua jendela waktu sebelumnya.

Kueri berikut menganalisis adopsi pengguna dengan menghitung jumlah aktivitas harian.

[Klik untuk menjalankan kueri]

let start=datetime(2017-08-01);
let end=datetime(2017-08-04);
let window=1d;
let T = datatable(UserId:string, Timestamp:datetime)
[
'A', datetime(2017-08-01),
'D', datetime(2017-08-01),
'J', datetime(2017-08-01),
'B', datetime(2017-08-01),
'C', datetime(2017-08-02),
'T', datetime(2017-08-02),
'J', datetime(2017-08-02),
'H', datetime(2017-08-03),
'T', datetime(2017-08-03),
'T', datetime(2017-08-03),
'J', datetime(2017-08-03),
'B', datetime(2017-08-03),
'S', datetime(2017-08-03),
'S', datetime(2017-08-04),
];
T
| evaluate activity_counts_metrics(UserId, Timestamp, start, end,
window)

plugin activity_engagement

activity_engagement plugin: Menghitung rasio keterlibatan aktivitas berdasarkan kolom ID melalui jendela garis waktu geser. activity_engagement dapat digunakan untuk menghitung DAU, WAU, dan MAU (pengguna aktif harian, mingguan, dan bulanan).

Kueri berikut mengembalikan rasio total pengguna berbeda menggunakan aplikasi setiap hari dibandingkan dengan total pengguna berbeda yang menggunakan aplikasi mingguan, pada jendela tujuh hari yang bergerak.

[Klik untuk menjalankan kueri]

// Generate random data of user activities
let _start = datetime(2017-01-01);
let _end = datetime(2017-01-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+100*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Calculate DAU/WAU ratio
| evaluate activity_engagement(['id'], _day, _start, _end, 1d, 7d)
| project _day, Dau_Wau=activity_ratio*100
| render timechart

Tip

Saat menghitung DAU/MAU, ubah data akhir dan periode jendela bergerak (OuterActivityWindow).

plugin activity_metrics

activity_metrics plugin: Menghitung metrik aktivitas yang berguna (nilai hitungan yang berbeda, jumlah nilai baru yang berbeda, tingkat retensi, dan laju churn) berdasarkan jendela periode saat ini vs. jendela periode sebelumnya.

Kueri berikut menghitung tingkat churn dan retensi untuk himpunan data tertentu.

[Klik untuk menjalankan kueri]

// Generate random data of user activities
let _start = datetime(2017-01-02);
let _end = datetime(2017-05-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
| where _day > datetime(2017-01-02)
| project _day, id
// Calculate weekly retention rate
| evaluate activity_metrics(['id'], _day, _start, _end, 7d)
| project _day, retention_rate*100, churn_rate*100
| render timechart

plugin new_activity_metrics

new_activity_metrics plugin: Menghitung metrik aktivitas yang berguna (nilai hitungan yang berbeda, jumlah nilai baru yang berbeda, tingkat retensi, dan laju churn) untuk kohort pengguna baru. Konsep plugin ini mirip dengan plugin activity_metrics, tetapi berfokus pada pengguna baru.

Kueri berikut menghitung tingkat retensi dan churn dengan jendela minggu ke minggu untuk kohort pengguna baru (pengguna yang tiba pada minggu pertama).

[Klik untuk menjalankan kueri]

// Generate random data of user activities
let _start = datetime(2017-05-01);
let _end = datetime(2017-05-31);
range Day from _start to _end step 1d
| extend d = tolong((Day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Take only the first week cohort (last parameter)
| evaluate new_activity_metrics(['id'], Day, _start, _end, 7d, _start)
| project from_Day, to_Day, retention_rate, churn_rate

plugin session_count

session_count plugin: Menghitung jumlah sesi berdasarkan kolom ID melalui garis waktu.

Kueri berikut mengembalikan jumlah sesi. Sesi dianggap aktif jika ID pengguna muncul setidaknya sekali pada jangka waktu 100 kali slot, sedangkan jendela tampilan balik sesi adalah slot 41 kali.

[Klik untuk menjalankan kueri]

let _data = range Timeline from 1 to 9999 step 1
| extend __key = 1
| join kind=inner (range Id from 1 to 50 step 1 | extend __key=1) on __key
| where Timeline % Id == 0
| project Timeline, Id;
// End of data definition
_data
| evaluate session_count(Id, Timeline, 1, 10000, 100, 41)
| render linechart

plugin funnel_sequence

funnel_sequence plugin: Menghitung jumlah pengguna yang berbeda yang telah mengambil urutan status; menunjukkan distribusi negara-negara sebelumnya dan berikutnya yang telah menyebabkan atau diikuti oleh urutan.

Kueri berikut menunjukkan peristiwa apa yang terjadi sebelum dan sesudah semua peristiwa Tornado pada tahun 2007.

[Klik untuk menjalankan kueri]

// Looking on StormEvents statistics:
// Q1: What happens before Tornado event?
// Q2: What happens after Tornado event?
StormEvents
| evaluate funnel_sequence(EpisodeId, StartTime, datetime(2007-01-01), datetime(2008-01-01), 1d,365d, EventType, dynamic(['Tornado']))

plugin funnel_sequence_completion

funnel_sequence_completion plugin: Menghitung corong langkah urutan yang telah selesai dalam periode waktu yang berbeda.

Kueri berikut memeriksa corong penyelesaian urutan: Hail -> Tornado -> Thunderstorm -> Wind dalam waktu "keseluruhan" satu jam, empat jam, dan satu hari ([1h, 4h, 1d]).

[Klik untuk menjalankan kueri]

let _start = datetime(2007-01-01);
let _end = datetime(2008-01-01);
let _windowSize = 365d;
let _sequence = dynamic(['Hail', 'Tornado', 'Thunderstorm', 'Wind']);
let _periods = dynamic([1h, 4h, 1d]);
StormEvents
| evaluate funnel_sequence_completion(EpisodeId, StartTime, _start, _end, _windowSize, EventType, _sequence, _periods)

Fungsi

Bagian ini mencakup fungsi: kueri yang dapat digunakan kembali yang disimpan di server. Fungsi dapat dipanggil oleh kueri dan fungsi lainnya (fungsi rekursif tidak didukung).

Catatan

Anda tidak dapat membuat fungsi pada kluster bantuan, yang hanya baca. Gunakan kluster pengujian Anda sendiri untuk bagian ini.

Contoh berikut membuat fungsi yang mengambil nama status (MyState) sebagai argumen.

.create function with (folder="Demo")
MyFunction (MyState: string)
{
StormEvents
| where State =~ MyState
}

Contoh berikut memanggil fungsi, yang mendapat data untuk negara bagian Texas.

MyFunction ("Texas")
| summarize count()

Contoh berikut menghapus fungsi yang dibuat pada langkah pertama.

.drop function MyFunction

Langkah berikutnya

Referensi Bahasa Kueri Kusto