Pola kueri umum di Azure Stream Analytics
Kueri di Azure Stream Analytics diekspresikan dalam bahasa kueri seperti SQL. Susunan bahasa didokumentasikan dalam panduan referensi bahasa kueri Azure Stream Analytics.
Desain kueri dapat mengekspresikan logika pass-through sederhana untuk memindahkan data peristiwa dari satu stream input ke penyimpanan data keluaran, atau dapat melakukan pencocokan pola yang kaya dan analisis temporal untuk menghitung agregat melalui berbagai jendela waktu seperti dalam Membangun IoT solusi dengan menggunakan panduan Azure Stream Analytics. Anda dapat menggabungkan data dari beberapa input untuk menggabungkan acara streaming, dan Anda dapat melakukan pencarian terhadap data referensi statis untuk memperkaya nilai acara. Anda juga dapat menulis data ke beberapa output.
Artikel ini menguraikan solusi untuk beberapa pola kueri umum berdasarkan skenario dunia nyata.
Format Data yang Didukung
Dukungan Azure Stream Analytics memproses peristiwa dalam format data CSV, JSON, dan Avro. Format JSON dan Avro dapat berisi jenis kompleks seperti objek berlapis (rekaman) atau array. Untuk informasi selengkapnya tentang bekerja dengan jenis data kompleks ini, lihat Mengurai data JSON dan AVRO.
Kirim data ke beberapa output
Beberapa pernyataan PILIH dapat digunakan untuk mengeluarkan data ke sink keluaran yang berbeda. Misalnya, satu pernyataan SELECT dapat menghasilkan pemberitahuan berbasis ambang sementara yang lain dapat menghasilkan peristiwa ke penyimpanan blob.
Pertimbangkan input berikut:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Dan, Anda menginginkan dua output berikut dari kueri:
ArchiveOutput:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
AlertOutput:
| Make | Time | Count |
| --- | --- | --- |
| Make2 |2023-01-01T00:00:10.0000000Z |3 |
Kueri dengan dua pernyataan SELECT dengan output Arsip dan Output pemberitahuan sebagai output:
SELECT
*
INTO
ArchiveOutput
FROM
Input TIMESTAMP BY Time
SELECT
Make,
System.TimeStamp() AS Time,
COUNT(*) AS [Count]
INTO
AlertOutput
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
HAVING
[Count] >= 3
Klausa INTO memberi tahu layanan Azure Stream Analytics output mana yang akan ditulis datanya. PILIH pertama mendefinisikan kueri penerusan yang menerima data dari masukan dan mengirimkannya ke keluaran bernama ArchiveOutput. Kueri kedua menggabungkan dan memfilter data sebelum mengirim hasil ke output sistem peringatan hilir yang disebut AlertOutput.
Klausa WITH dapat digunakan untuk menentukan beberapa blok subkueri. Opsi ini memiliki manfaat membuka lebih sedikit pembaca ke sumber input.
Kueri:
WITH ReaderQuery AS (
SELECT
*
FROM
Input TIMESTAMP BY Time
)
SELECT * INTO ArchiveOutput FROM ReaderQuery
SELECT
Make,
System.TimeStamp() AS Time,
COUNT(*) AS [Count]
INTO AlertOutput
FROM ReaderQuery
GROUP BY
Make,
TumblingWindow(second, 10)
HAVING [Count] >= 3
Untuk informasi selengkapnya, lihat DENGAN klausa.
Permintaan pass-through sederhana
Permintaan pass-through sederhana dapat digunakan untuk menyalin data stream input ke dalam output. Misalnya, jika aliran data yang berisi informasi kendaraan real-time perlu disimpan dalam database SQL untuk analisis nanti, kueri pass-through sederhana melakukan pekerjaan tersebut.
Pertimbangkan input berikut:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Anda ingin output sama dengan input:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Berikut kuerinya:
SELECT
*
INTO Output
FROM Input
Kueri SELECT * ini memproyeksikan semua bidang peristiwa masuk dan mengirimkannya ke output. Sebagai gantinya, Anda hanya dapat memproyeksikan bidang yang diperlukan dalam pernyataan SELECT . Dalam contoh berikut, pernyataan SELECT hanya memproyeksikan bidang Buat dan Waktu dari data input.
Pertimbangkan input berikut:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |
Anda ingin output hanya memiliki bidang Buat dan Waktu:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |
Berikut adalah kueri yang hanya memproyeksikan bidang yang diperlukan:
SELECT
Make, Time
INTO Output
FROM Input
Pencocokan string dengan LIKE dan NOT LIKE
LIKE dan NOT LIKE dapat digunakan untuk memverifikasi apakah suatu bidang cocok dengan pola tertentu. Misalnya, Anda dapat menggunakan filter untuk mengembalikan hanya pelat lisensi yang dimulai dengan huruf A
dan diakhir dengan angka 9
.
Pertimbangkan input berikut:
| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |
Anda ingin output memiliki pelat nomor yang dimulai dengan huruf A
dan diakhir dengan angka 9
:
| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |
Berikut adalah kueri yang menggunakan operator LIKE:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Gunakan pernyataan LIKE untuk memeriksa nilai bidang License_plate. Ini harus dimulai dengan huruf A
, lalu memiliki untai (karakter) nol atau lebih, berakhir dengan angka 9.
Perhitungan atas peristiwa masa lalu
Fungsi LAG dapat digunakan untuk melihat peristiwa masa lalu dalam jendela waktu dan membandingkannya dengan peristiwa saat ini. Misalnya, membuat mobil saat ini dapat dihasilkan jika berbeda dari pembuatan mobil terakhir yang melewati pintu tol.
Contoh input:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
Contoh output:
| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |
Kueri sampel:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Gunakan LAG untuk mengintip ke dalam stream masukan satu peristiwa kembali, mengambil nilai Buat dan membandingkannya dengan nilai Buat peristiwa saat ini dan keluaran peristiwa tersebut.
Untuk informasi selengkapnya, lihat LAG.
Kembalikan acara terakhir di jendela
Karena peristiwa dikonsumsi oleh sistem secara real time, tidak ada fungsi yang dapat menentukan apakah peristiwa adalah peristiwa terakhir yang tiba untuk jendela waktu tersebut. Untuk mencapai hal ini, aliran input perlu digabungkan dengan yang lain di mana waktu peristiwa adalah waktu maksimum untuk semua peristiwa di jendela tersebut.
Contoh input:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Contoh output dengan informasi tentang mobil terakhir dalam dua jendela waktu sepuluh menit:
| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Kueri sampel:
WITH LastInWindow AS
(
SELECT
MAX(Time) AS LastEventTime
FROM
Input TIMESTAMP BY Time
GROUP BY
TumblingWindow(minute, 10)
)
SELECT
Input.License_plate,
Input.Make,
Input.Time
FROM
Input TIMESTAMP BY Time
INNER JOIN LastInWindow
ON DATEDIFF(minute, Input, LastInWindow) BETWEEN 0 AND 10
AND Input.Time = LastInWindow.LastEventTime
Langkah pertama pada kueri menemukan stempel waktu maksimum di jendela 10 menit, yaitu, stempel waktu peristiwa terakhir untuk jendela tersebut. Langkah kedua menggabungkan hasil kueri pertama dengan aliran asli untuk menemukan peristiwa yang cocok dengan stempel waktu terakhir di setiap jendela.
DATEDIFF adalah fungsi khusus tanggal yang membandingkan dan mengembalikan perbedaan waktu antara dua bidang TanggalWaktu, untuk informasi selengkapnya, lihatfungsi tanggal.
Untuk informasi selengkapnya tentang bergabung dengan stream, lihat GABUNG.
Agregasi data dari waktu ke waktu
Untuk menghitung informasi selama jendela waktu, Anda dapat mengagregasi data. Dalam contoh ini, pernyataan menghitung hitungan selama 10 detik terakhir untuk setiap pembuatan mobil tertentu.
Contoh input:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |
Contoh output:
| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |
Kueri:
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Agregasi ini mengelompokkan mobil menurut Membuat dan menghitungnya setiap 10 detik. Output memiliki Make and Count mobil yang melewati pintu tol.
TumblingWindow adalah fungsi windowing yang digunakan untuk mengelompokkan acara bersama-sama. Agregasi dapat diterapkan pada semua peristiwa yang dikelompokkan. Untuk informasi selengkapnya, lihat fungsi jendela.
Untuk informasi selengkapnya tentang agregasi, lihat fungsi agregat.
Nilai keluaran secara berkala
Ketika peristiwa hilang atau tidak teratur, output interval reguler dapat dihasilkan dari input data yang lebih jarang. Misalnya, buat peristiwa setiap 5 detik yang melaporkan titik data yang paling baru dilihat.
Contoh input:
| Time | Value |
| --- | --- |
| "2014-01-01T06:01:00" |1 |
| "2014-01-01T06:01:05" |2 |
| "2014-01-01T06:01:10" |3 |
| "2014-01-01T06:01:15" |4 |
| "2014-01-01T06:01:30" |5 |
| "2014-01-01T06:01:35" |6 |
Sampel output (10 baris pertama):
| Window_end | Last_event.Time | Last_event.Value |
| --- | --- | --- |
| 2014-01-01T14:01:00.000Z |2014-01-01T14:01:00.000Z |1 |
| 2014-01-01T14:01:05.000Z |2014-01-01T14:01:05.000Z |2 |
| 2014-01-01T14:01:10.000Z |2014-01-01T14:01:10.000Z |3 |
| 2014-01-01T14:01:15.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:20.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:25.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:30.000Z |2014-01-01T14:01:30.000Z |5 |
| 2014-01-01T14:01:35.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:40.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:45.000Z |2014-01-01T14:01:35.000Z |6 |
Kueri sampel:
SELECT
System.Timestamp() AS Window_end,
TopOne() OVER (ORDER BY Time DESC) AS Last_event
FROM
Input TIMESTAMP BY Time
GROUP BY
HOPPINGWINDOW(second, 300, 5)
Kueri ini menghasilkan peristiwa setiap 5 detik dan menampilkan peristiwa terakhir yang diterima sebelumnya. Durasi HOPPINGWINDOW menentukan seberapa jauh ke belakang tampilan kueri untuk menemukan acara terbaru.
Untuk informasi selengkapnya, lihat Jendela melompat.
Menghubungkan peristiwa dalam stream a
Menghubungkan peristiwa dalam stream yang sama dapat dilakukan dengan melihat peristiwa sebelumnya menggunakan fungsi LAG. Misalnya, output dapat dihasilkan setiap kali dua mobil berturut-turut dari yang sama Buat melalui pintu tol dalam 90 detik terakhir.
Contoh input:
| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make1 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make2 |DEF-987 |2023-01-01T00:00:03.0000000Z |
| Make1 |GHI-345 |2023-01-01T00:00:04.0000000Z |
Contoh output:
| Make | Time | Current_car_license_plate | First_car_license_plate | First_car_time |
| --- | --- | --- | --- | --- |
| Make1 |2023-01-01T00:00:02.0000000Z |AAA-999 |ABC-123 |2023-01-01T00:00:01.0000000Z |
Kueri sampel:
SELECT
Make,
Time,
License_plate AS Current_car_license_plate,
LAG(License_plate, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_license_plate,
LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make
Fungsi LAG dapat melihat ke dalam stream masukan satu peristiwa kembali dan mengambil nilai Buat, membandingkannya dengan nilai Buat peristiwa saat ini. Setelah kondisi terpenuhi, data dari peristiwa sebelumnya dapat diproyeksikan menggunakan LAG dalam pernyataan PILIH.
Untuk informasi selengkapnya, lihat LAG.
Deteksi durasi antar acara
Durasi acara dapat dihitung dengan melihat acara Mulai terakhir setelah acara Akhir diterima. Kueri ini dapat berguna untuk menentukan waktu yang dihabiskan pengguna di halaman atau fitur.
Contoh input:
| User | Feature | Event | Time |
| --- | --- | --- | --- |
| user@location.com |RightMenu |Start |2023-01-01T00:00:01.0000000Z |
| user@location.com |RightMenu |End |2023-01-01T00:00:08.0000000Z |
Contoh output:
| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |
Kueri sampel:
SELECT
[user],
feature,
DATEDIFF(
second,
LAST(Time) OVER (PARTITION BY [user], feature LIMIT DURATION(hour, 1) WHEN Event = 'start'),
Time) as duration
FROM input TIMESTAMP BY Time
WHERE
Event = 'end'
Fungsi LAST dapat digunakan untuk mengambil peristiwa terakhir dalam kondisi tertentu. Dalam contoh ini, kondisinya adalah peristiwa dengan tipe Mulai, mempartisi penelusuran menurut pengguna dan fitur PARTITION BY. Dengan cara ini, setiap pengguna, dan fitur diperlakukan secara independen saat mencari peristiwa Mulai. LIMIT DURATION membatasi waktu penelusuran hingga 1 jam antara peristiwa Akhir dan Awal.
Hitung nilai unik
COUNT dan DISTINCT dapat digunakan untuk menghitung jumlah nilai bidang unik yang muncul di stream dalam jangka waktu tertentu. Anda dapat membuat kueri untuk menghitung berapa banyak Pembuatan mobil unik yang telah melewati pintu tol di jendela 2 detik.
Contoh input:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Contoh output:
| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |
Kueri sampel :
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
COUNT(DISTINCT Make) mengembalikan jumlah nilai yang berbeda di kolom Buat dalam jangka waktu. Untuk informasi selengkapnya, lihat COUNT fungsi agregat.
Ambil acara pertama di jendela
Anda dapat menggunakan IsFirst
untuk mengambil peristiwa pertama dalam jendela waktu. Misalnya, mengeluarkan informasi mobil pertama setiap interval 10 menit.
Contoh input:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Contoh output:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
Kueri sampel:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst juga dapat mempartisi data dan menghitung peristiwa pertama untuk setiap mobil tertentu yang Buat ditemukan pada setiap interval 10 menit.
Contoh output:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Kueri sampel:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Untuk informasi selengkapnya, lihat IsFirst.
Hapus acara duplikat di jendela
Saat Anda melakukan operasi seperti menghitung rata-rata atas peristiwa di jendela waktu tertentu, peristiwa duplikat harus difilter. Dalam contoh berikut, acara kedua adalah duplikat dari yang pertama.
Contoh input:
| DeviceId | Time | Attribute | Value |
| --- | --- | --- | --- |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 2 |2018-07-27T00:00:01.0000000Z |Temperature |40 |
| 1 |2018-07-27T00:00:05.0000000Z |Temperature |60 |
| 2 |2018-07-27T00:00:05.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:10.0000000Z |Temperature |100 |
Contoh output:
| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |
Kueri sampel:
WITH Temp AS (
SELECT Value, DeviceId
FROM Input TIMESTAMP BY Time
GROUP BY Value, DeviceId, System.Timestamp()
)
SELECT
AVG(Value) AS AverageValue, DeviceId
INTO Output
FROM Temp
GROUP BY DeviceId,TumblingWindow(minute, 5)
Ketika pernyataan pertama dijalankan, rekaman duplikat digabungkan menjadi satu karena bidang dalam klausa grup menurut semuanya sama. Oleh karena itu, ia menghapus duplikat.
Tentukan logika untuk kasus/nilai yang berbeda (pernyataan CASE)
Pernyataan CASE dapat memberikan penghitungan yang berbeda untuk bidang yang berbeda, berdasarkan kriteria tertentu. Misalnya, tetapkan jalur A
ke mobil dan jalur B
ke buatan Make1
lain.
Contoh input:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Contoh output:
| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |
Kueri sampel:
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
Ekspresi CASE membandingkan ekspresi dengan sekumpulan ekspresi sederhana untuk menentukan hasilnya. Dalam contoh ini, kendaraan Make1
dikirim ke jalur A
sementara kendaraan buatan lain akan ditetapkan jalur B
.
Untuk informasi selengkapnya, lihat kasus ekspresi.
Konversi data
Data dapat tansmisikan waktu nyata menggunakan metode CAST. Misalnya, bobot mobil dapat dikonversi dari jenis nvarchar(maks) ke jenis bigint dan digunakan dalam perhitungan numerik.
Contoh input:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Contoh output:
| Make | Weight |
| --- | --- |
| Make1 |3000 |
Kueri sampel:
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Gunakan pernyataan CAST untuk menentukan tipe datanya. Lihat daftar jenis data yang didukung di Jenis data (Azure Stream Analytics).
Untuk informasi selengkapnya tentang fungsi konversi data.
Mendeteksi durasi suatu kondisi
Untuk kondisi yang mencakup beberapa peristiwa, fungsi LAG dapat digunakan untuk mengidentifikasi durasi kondisi tersebut. Misalnya, misalkan bug mengakibatkan semua mobil memiliki bobot yang salah (di atas 20.000 pon), dan durasi bug itu harus dihitung.
Contoh input:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |2000 |
| Make2 |2023-01-01T00:00:02.0000000Z |25000 |
| Make1 |2023-01-01T00:00:03.0000000Z |26000 |
| Make2 |2023-01-01T00:00:04.0000000Z |25000 |
| Make1 |2023-01-01T00:00:05.0000000Z |26000 |
| Make2 |2023-01-01T00:00:06.0000000Z |25000 |
| Make1 |2023-01-01T00:00:07.0000000Z |26000 |
| Make2 |2023-01-01T00:00:08.0000000Z |2000 |
Contoh output:
| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |
Kueri sampel:
WITH SelectPreviousEvent AS
(
SELECT
*,
LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
LAG([weight]) OVER (LIMIT DURATION(hour, 24)) as previous_weight
FROM input TIMESTAMP BY [time]
)
SELECT
LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_weight < 20000 ) [Start_fault],
previous_time [End_fault]
FROM SelectPreviousEvent
WHERE
[weight] < 20000
AND previous_weight > 20000
Pernyataan PILIH pertama menghubungkan pengukuran berat saat ini dengan pengukuran sebelumnya, memproyeksikannya bersama dengan pengukuran saat ini. PILIH kedua melihat kembali ke peristiwa terakhir dengan bobot_sebelumnya kurang dari 20000, dengan bobot saat ini lebih kecil dari 20000 dan berat_sebelumnya dari peristiwa saat ini lebih besar dari 20000.
End_fault adalah peristiwa nonfaulty saat ini di mana peristiwa sebelumnya rusak, dan Start_fault adalah peristiwa nonfaulty terakhir sebelum itu.
Proses peristiwa dengan waktu independen (Substream)
Acara dapat datang terlambat atau rusak karena perbedaan jam antara produser acara, kemiringan jam antara partisi, atau latensi jaringan. Misalnya, jam perangkat untuk TollID 2 adalah lima detik di belakang TollID 1, dan jam perangkat untuk TollID 3 adalah 10 detik di belakang TollID 1. Perhitungan dapat terjadi secara independen untuk setiap tol, dengan hanya mempertimbangkan data jamnya sendiri sebagai stempel waktu.
Contoh input:
| LicensePlate | Make | Time | TollID |
| --- | --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:01.0000000Z | 1 |
| YHN 6970 |Make2 |2023-07-27T00:00:05.0000000Z | 1 |
| QYF 9358 |Make1 |2023-07-27T00:00:01.0000000Z | 2 |
| GXF 9462 |Make3 |2023-07-27T00:00:04.0000000Z | 2 |
| VFE 1616 |Make2 |2023-07-27T00:00:10.0000000Z | 1 |
| RMV 8282 |Make1 |2023-07-27T00:00:03.0000000Z | 3 |
| MDR 6128 |Make3 |2023-07-27T00:00:11.0000000Z | 2 |
| YZK 5704 |Make4 |2023-07-27T00:00:07.0000000Z | 3 |
Contoh output:
| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Kueri sampel:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
Klausa TIMESTAMP OVER BY melihat setiap linimasa perangkat secara independen menggunakan sub-stream. Peristiwa output untuk setiap TollID dihasilkan saat dikomputasi, artinya peristiwa tersebut berurutan sehubungan dengan setiap TollID alih-alih diurutkan ulang seolah-olah semua perangkat berada pada jam yang sama.
Untuk informasi selengkapnya, lihat STEMPEL WAKTU LEBIH DARI.
Jendela Sesi
Jendela sesi adalah jendela yang terus diperluas saat peristiwa terjadi dan ditutup untuk komputasi jika tidak ada peristiwa yang diterima setelah jumlah waktu tertentu atau jika jendela mencapai durasi maksimumnya. Jendela ini sangat berguna saat menghitung data interaksi pengguna. Jendela dimulai ketika pengguna mulai berinteraksi dengan sistem dan menutup ketika tidak ada lagi peristiwa yang diamati, artinya pengguna telah berhenti berinteraksi. Misalnya, pengguna berinteraksi dengan halaman web di mana jumlah klik dicatat, Jendela Sesi dapat digunakan untuk mengetahui berapa lama pengguna berinteraksi dengan situs.
Contoh input:
| User_id | Time | URL |
| --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | "www.example.com/a.html" |
| 0 | 2017-01-26T00:00:20.0000000Z | "www.example.com/b.html" |
| 1 | 2017-01-26T00:00:55.0000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10.0000000Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.0000000Z | "www.example.com/e.html" |
Contoh output:
| User_id | StartTime | EndTime | Duration_in_seconds |
| --- | --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | 2017-01-26T00:01:10.0000000Z | 70 |
| 1 | 2017-01-26T00:00:55.0000000Z | 2017-01-26T00:01:15.0000000Z | 20 |
Kueri sampel:
SELECT
user_id,
MIN(time) as StartTime,
MAX(time) as EndTime,
DATEDIFF(second, MIN(time), MAX(time)) AS duration_in_seconds
FROM input TIMESTAMP BY time
GROUP BY
user_id,
SessionWindow(minute, 1, 60) OVER (PARTITION BY user_id)
PILIH memproyeksikan data yang relevan dengan interaksi pengguna, bersama dengan durasi interaksi. Mengelompokkan data menurut pengguna dan SessionWindow yang ditutup jika tidak ada interaksi yang terjadi dalam 1 menit, dengan ukuran jendela maksimum 60 menit.
Untuk informasi selengkapnya tentang SessionWindow, lihatSessionWindow.
Fungsi yang ditentukan pengguna di JavaScript dan C#
Bahasa kueri Azure Stream Analytics dapat diperluas dengan fungsi kustom yang ditulis dalam bahasa JavaScript atau C#. Fungsi yang Ditentukan Pengguna (UDF) adalah komputasi kustom/kompleks yang tidak dapat dengan mudah diekspresikan menggunakan bahasa SQL. UDF ini dapat ditentukan sekali dan digunakan beberapa kali dalam kueri. Misalnya, UDF dapat digunakan untuk mengonversi nilai nvarchar(max) heksadesimal menjadi nilai bigint.
Contoh input:
| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |
Contoh output:
| Device_id | Decimal |
| --- | --- |
| 1 | 180 |
| 2 | 283 |
| 3 | 289 |
function hex2Int(hexValue){
return parseInt(hexValue, 16);
}
public static class MyUdfClass {
public static long Hex2Int(string hexValue){
return int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
}
}
SELECT
Device_id,
udf.Hex2Int(HexValue) AS Decimal
From
Input
Fungsi yang Ditentukan Pengguna menghitung nilai bigint dari HexValue pada setiap peristiwa yang dikonsumsi.
Untuk informasi selengkapnya, lihat JavaScript dan C#.
Pencocokan pola tingkat lanjut dengan MATCH_RECOGNIZE
MATCH_RECOGNIZE adalah mekanisme pencocokan pola lanjutan yang dapat digunakan untuk mencocokkan urutan peristiwa dengan pola ekspresi reguler yang terdefinisi dengan baik. Misalnya, ATM sedang dipantau secara real time untuk kegagalan, selama pengoperasian ATM jika ada dua pesan peringatan berturut-turut, administrator perlu diberi tahu.
Input:
| ATM_id | Operation_id | Return_Code | Time |
| --- | --- | --- | --- |
| 1 | "Entering Pin" | "Success" | 2017-01-26T00:10:00.0000000Z |
| 2 | "Opening Money Slot" | "Success" | 2017-01-26T00:10:07.0000000Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11.0000000Z |
| 1 | "Entering Withdraw Quantity" | "Success" | 2017-01-26T00:10:08.0000000Z |
| 1 | "Opening Money Slot" | "Warning" | 2017-01-26T00:10:14.0000000Z |
| 1 | "Printing Bank Balance" | "Warning" | 2017-01-26T00:10:19.0000000Z |
Output:
| ATM_id | First_Warning_Operation_id | Warning_Time |
| --- | --- | --- |
| 1 | "Opening Money Slot" | 2017-01-26T00:10:14.0000000Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
LIMIT DURATION(minute, 1)
PARTITION BY ATM_id
MEASURES
First(Warning.ATM_id) AS ATM_id,
First(Warning.Operation_Id) AS First_Warning_Operation_id,
First(Warning.Time) AS Warning_Time
AFTER MATCH SKIP TO NEXT ROW
PATTERN (Success+ Warning{2,})
DEFINE
Success AS Succes.Return_Code = 'Success',
Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch
Kueri ini cocok dengan setidaknya dua peristiwa kegagalan berturut-turut dan menghasilkan alarm ketika kondisi terpenuhi. PATTERN mendefinisikan ekspresi reguler yang akan digunakan pada pencocokan, dalam hal ini, setidaknya dua peringatan berturut-turut setelah setidaknya satu operasi berhasil. Keberhasilan dan Kegagalan ditentukan menggunakan nilai Return_Code dan setelah kondisi terpenuhi, MEASURES diproyeksikan dengan ATM_id, operasi peringatan pertama dan waktu peringatan pertama.
Untuk informasi selengkapnya, lihat MATCH_RECOGNIZE.
Geofencing dan kueri geospasial
Azure Stream Analytics menyediakan fungsi geospasial bawaan yang dapat digunakan untuk menerapkan skenario seperti manajemen armada, berbagi perjalanan, mobil yang terhubung, dan pelacakan aset. Data geospasial dapat diserap dalam format GeoJSON atau WKT sebagai bagian dari stream peristiwa atau data referensi. Misalnya, sebuah perusahaan yang mengkhususkan diri dalam pembuatan mesin untuk mencetak paspor, menyewakan mesin mereka kepada pemerintah dan konsulat. Lokasi mesin-mesin tersebut sangat dikontrol untuk menghindari kesalahan penempatan dan kemungkinan penggunaan untuk pemalsuan paspor. Setiap mesin dilengkapi dengan pelacak GPS, informasi tersebut disampaikan kembali ke pekerjaan Azure Stream Analytics. Pabrikan ingin melacak lokasi mesin-mesin itu dan diberi tahu jika salah satu dari mereka meninggalkan area resmi, dengan cara ini mereka dapat menonaktifkan, memperingatkan pihak berwenang, dan mengambil peralatan dari jarak jauh.
Input:
| Equipment_id | Equipment_current_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13288797982818 47.64082002051315)" | 2017-01-26T00:10:00.0000000Z |
| 1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00.0000000Z |
| 1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00.0000000Z |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
Masukan Data Referensi:
| Equipment_id | Equipment_lease_location |
| --- | --- |
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))" |
Output:
| Equipment_id | Equipment_alert_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
SELECT
input.Equipment_id AS Equipment_id,
input.Equipment_current_location AS Equipment_current_location,
input.Time AS Time
FROM input TIMESTAMP BY time
JOIN
referenceInput
ON input.Equipment_id = referenceInput.Equipment_id
WHERE
ST_WITHIN(input.Equipment_currenct_location, referenceInput.Equipment_lease_location) = 1
Kueri memungkinkan pabrikan untuk memantau lokasi mesin secara otomatis, mendapatkan peringatan saat mesin meninggalkan geofence yang diizinkan. Fungsi geospasial bawaan memungkinkan pengguna untuk menggunakan data GPS dalam kueri tanpa perpustakaan pihak ketiga.
Untuk informasi selengkapnya, lihat artikel Skenario geofencing dan agregasi geospasial dengan Azure Stream Analytics.
Dapatkan bantuan
Untuk bantuan lebih lanjut, coba halaman pertanyaan Microsoft Q&A untuk Azure Stream Analytics.