Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Fabric Eventstream dibangun pada runtime yang sama dengan Azure Stream Analytics. Oleh karena itu, konsep yang dijelaskan dalam artikel ini berlaku untuk Azure Stream Analytics dan Fabric Eventstream.
Kueri di Azure Stream Analytics dinyatakan dalam bahasa kueri seperti SQL. Konstruksi bahasa didokumenkan dalam panduan referensi bahasa kueri Stream Analytics.
Desain kueri dapat mengekspresikan logika pass-through sederhana untuk memindahkan data peristiwa dari satu aliran input ke penyimpanan data output, atau dapat melakukan pencocokan pola yang kaya dan analisis temporal untuk menghitung agregat di berbagai jendela waktu seperti dalam panduan Membangun solusi IoT dengan menggunakan Panduan Azure Stream Analytics . Anda dapat menggabungkan data dari beberapa input untuk menggabungkan peristiwa streaming, dan Anda dapat melakukan pencarian terhadap data referensi statis untuk memperkaya nilai peristiwa. 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
Azure Stream Analytics mendukung pemrosesan 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.
Mengirim data ke beberapa output
Beberapa pernyataan SELECT dapat digunakan untuk menghasilkan data ke sink output 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 serta output Arsip dan Pemberitahuan:
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. SELECT pertama menentukan kueri pass-through yang menerima data dari input dan mengirimkannya ke output 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 mengurangi jumlah pengguna yang membuka 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 klausa WITH.
Kueri pass-through sederhana
Kueri pass-through sederhana dapat digunakan untuk menyalin data aliran 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 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 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 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 sebelumnya
Fungsi LAG dapat digunakan untuk melihat peristiwa sebelumnya dalam jendela waktu dan membandingkannya dengan peristiwa saat ini. Misalnya, merek mobil saat ini dapat ditampilkan jika berbeda dari merek 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 |
Sampel kueri:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Gunakan LAG untuk melihat ke dalam aliran input satu kejadian sebelumnya, ambil nilai Make dan bandingkan dengan nilai Make dari kejadian saat ini, lalu keluarkan kejadian tersebut.
Untuk informasi selengkapnya, lihat LAG.
Mengembalikan peristiwa terakhir dalam 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-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 |
Sampel query:
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 waktu.
DATEDIFF adalah fungsi khusus tanggal yang membandingkan dan mengembalikan perbedaan waktu antara dua bidang DateTime, untuk informasi selengkapnya, lihat fungsi tanggal.
Untuk informasi selengkapnya tentang menggabungkan aliran, lihat JOIN.
Agregasi data dari waktu ke waktu
Untuk menghitung informasi selama jendela waktu, Anda dapat mengagregasi data. Dalam contoh ini, pernyataan menghitung jumlah selama 10 detik terakhir untuk setiap merek 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 berdasarkan Make dan menghitungnya setiap 10 detik. Keluaran memiliki Make dan Count dari mobil yang melewati pintu tol.
TumblingWindow adalah fungsi windowing yang digunakan untuk mengelompokkan peristiwa bersama-sama. Agregasi dapat diterapkan di semua peristiwa yang dikelompokkan. Untuk informasi selengkapnya, lihat fungsi windowing.
Untuk informasi selengkapnya tentang agregasi, lihat fungsi agregat.
Keluarkan nilai 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 terakhir 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 |
Contoh query:
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 menghasilkan peristiwa terakhir yang diterima sebelumnya. Durasi HOPPINGWINDOW menentukan seberapa jauh ke belakang kueri mencari untuk menemukan peristiwa terbaru.
Untuk informasi selengkapnya, lihat Jendela hopping.
Menghubungkan peristiwa dalam aliran
Menghubungkan peristiwa dalam aliran yang sama dapat dilakukan dengan melihat peristiwa sebelumnya menggunakan fungsi LAG . Misalnya, output dapat dihasilkan setiap kali dua mobil berturut-turut dari merk yang sama Merk melewati 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 |
Sampel kueri:
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 arus data masuk satu peristiwa sebelumnya dan mengambil nilai Make, membandingkannya dengan nilai Make dari peristiwa saat ini. Setelah kondisi terpenuhi, data dari peristiwa sebelumnya dapat diproyeksikan menggunakan LAG dalam pernyataan SELECT .
Untuk informasi selengkapnya, lihat LAG.
Mendeteksi durasi antar peristiwa
Durasi peristiwa dapat dihitung dengan melihat peristiwa Mulai terakhir setelah peristiwa Akhir diterima. Kueri ini dapat berguna untuk menentukan waktu yang dihabiskan pengguna pada 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 |
Sampel kueri:
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 tipe Start, mempartisi pencarian dengan PARTITION BY pengguna dan fitur. Dengan cara ini, setiap pengguna, dan fitur diperlakukan secara independen saat mencari peristiwa Mulai. LIMIT DURATION membatasi pencarian kembali ke waktu 1 jam antara peristiwa Akhir dan Mulai.
Menghitung nilai unik
COUNT dan DISTINCT dapat digunakan untuk menghitung jumlah nilai bidang unik yang muncul di aliran dalam jendela waktu. Anda dapat membuat kueri untuk menghitung berapa banyak merek mobil unik yang telah melewati pintu tol dalam rentang 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 contoh:
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 jendela waktu. Untuk informasi selengkapnya, lihat Fungsi agregat COUNT.
Mengambil peristiwa pertama di jendela aplikasi
Anda dapat menggunakan IsFirst untuk mengambil peristiwa pertama dalam jendela waktu. Misalnya, mengeluarkan informasi mobil pertama pada 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 |
Sampel kueri:
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 merek mobil tertentu yang 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 |
Sampel kueri:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Untuk informasi selengkapnya, lihat IsFirst.
Menghapus peristiwa duplikat di jendela
Saat Anda melakukan operasi seperti menghitung rata-rata atas peristiwa di jendela waktu tertentu, peristiwa duplikat harus difilter. Dalam contoh berikut, peristiwa 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 |
Sampel kueri:
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, catatan duplikat digabungkan menjadi satu karena bidang dalam klausa group by semuanya memiliki nilai yang sama. Oleh karena itu, ia menghapus duplikat.
Tentukan logika untuk kasus/nilai yang berbeda (pernyataan CASE)
Pernyataan CASE dapat memberikan komputasi yang berbeda untuk bidang yang berbeda, berdasarkan kriteria tertentu. Misalnya, tetapkan jalur A untuk mobil dari merek Make1, dan jalur B untuk merek lainnya.
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 |
Sampel kueri:
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 dengan merek lain akan ditempatkan di jalur B.
Untuk informasi selengkapnya, lihat ekspresi kasus.
Konversi data
Data dapat dilemparkan secara real time 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 |
Sampel kueri:
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 jenis datanya. Lihat daftar jenis data yang didukung pada 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, seandainya sebuah bug mengakibatkan semua mobil memiliki berat yang salah (lebih dari 20.000 pon), dan durasi bug tersebut 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 |
Sampel kueri:
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 SELECT pertama mengkorelasikan pengukuran berat saat ini dengan pengukuran sebelumnya, memproyeikannya bersama dengan pengukuran saat ini. SELECT kedua menelusuri kembali peristiwa terakhir yang mana previous_weight kurang dari 20000, di mana berat saat ini juga kurang dari 20000 dan previous_weight pada peristiwa saat ini lebih dari 20000.
End_fault adalah peristiwa tidak bermasalah saat ini ketika peristiwa sebelumnya bermasalah, dan Start_fault adalah peristiwa tidak bermasalah terakhir sebelumnya.
Memproses event dengan waktu independen (Substreams)
Kejadian dapat terjadi terlambat atau tidak berurutan karena perbedaan waktu antara penghasil kejadian, latensi jaringan, atau perbedaan waktu antara partisi. 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. Komputasi dapat terjadi secara independen untuk setiap tol, mengingat hanya data jamnya sendiri sebagai tanda 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 |
Sampel kueri:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
Klausa TIMESTAMP OVER BY memeriksa setiap garis waktu perangkat secara independen menggunakan sub-aliran. Peristiwa output untuk setiap TollID dihasilkan segera setelah dihitung, yang berarti bahwa peristiwa tersebut tetap berurutan dengan setiap TollID dan bukan diurutkan ulang seakan-akan semua perangkat berjalan menggunakan jam yang sama.
Untuk informasi selengkapnya, lihat TIMESTAMP BY OVER.
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 tempat 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 |
Sampel kueri:
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)
SELECT 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 waktu 1 menit, dengan ukuran jendela maksimum 60 menit.
Untuk informasi selengkapnya tentang SessionWindow, lihat Jendela Sesi .
Fungsi yang ditentukan pengguna di JavaScript dan C#
Nota
Bagian ini tidak berlaku untuk Fabric Eventstream.
Bahasa kueri Azure Stream Analytics dapat diperluas dengan fungsi kustom yang ditulis baik dalam bahasa JavaScript atau C#. User Defined Functions (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 User-Defined 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 waktu nyata untuk kerusakan, selama pengoperasian ATM jika ada dua pesan peringatan berturut-turut, administrator harus diberitahu.
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 Success.Return_Code = 'Success',
Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch
Kueri ini cocok dengan setidaknya dua peristiwa kegagalan berturut-turut dan menghasilkan alarm saat 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 Peringatan didefinisikan 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.
Kueri geofencing dan geospasial
Azure Stream Analytics menyediakan fungsi geospasial bawaan yang dapat digunakan untuk menerapkan skenario seperti manajemen armada, berbagi tumpangan, mobil yang terhubung, dan pelacakan aset. Data geospasial dapat diserap dalam format GeoJSON atau WKT sebagai bagian dari data eventstream atau referensi. Misalnya, perusahaan yang mengkhususkan diri dalam mesin manufaktur untuk mencetak paspor, menyewakan mesin mereka kepada pemerintah dan konsulat. Lokasi mesin-mesin tersebut sangat dikontrol untuk menghindari kesalahan penggantian dan kemungkinan penggunaan untuk pemalsuan paspor. Setiap komputer dilengkapi dengan pelacak GPS, informasi tersebut disampaikan kembali ke pekerjaan Azure Stream Analytics. Manufaktur ingin melacak lokasi mesin-mesin tersebut dan diberi tahu jika salah satu dari mereka meninggalkan area resmi, dengan cara ini mereka dapat menonaktifkan dari jarak jauh, memperingatkan pihak berwenang dan mengambil peralatan.
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 |
Input 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_current_location, referenceInput.Equipment_lease_location) = 1
Kueri memungkinkan pabrikan untuk memantau lokasi mesin secara otomatis dan mendapatkan pemberitahuan ketika mesin meninggalkan batas geofence yang diizinkan. Fungsi geospasial bawaan memungkinkan pengguna untuk menggunakan data GPS dalam kueri tanpa pustaka 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.