Pola kueri umum di Azure Stream Analytics dan Fabric Eventstream

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.

Langkah berikutnya