TIMESTAMP BY (Azure Stream Analytics)
Semua peristiwa aliran data memiliki tanda waktu yang terkait dengannya. Secara default, peristiwa dari Event Hub dan IoT Hub diberi tanda waktu berdasarkan kapan peristiwa diterima oleh Event Hub atau IoT Hub; peristiwa dari penyimpanan Blob diberi tanda waktu oleh waktu modifikasi terakhir blob. Tanda waktu peristiwa tidak berubah jika Anda memulai kembali atau menjalankan kembali pekerjaan Anda.
Banyak aplikasi streaming memerlukan penggunaan tanda waktu yang tepat bahwa suatu peristiwa terjadi, bukan waktu kedatangan. Misalnya, dalam aplikasi Point of Sales seseorang mungkin memerlukan tanda waktu peristiwa yang sesuai dengan waktu pembayaran dicatat, daripada waktu peristiwa pembayaran mencapai layanan penyerapan peristiwa. Selain itu, sistem terdistribusi geografis dan latensi jaringan dapat berkontribusi pada waktu kedatangan yang tidak dapat diprediksi, membuat penggunaan waktu aplikasi lebih andal dalam aplikasi streaming. Untuk kasus ini, klausa TIMESTAMP BY memungkinkan menentukan nilai tanda waktu kustom. Nilai dapat berupa bidang apa pun dari payload peristiwa atau ekspresi jenis DATETIME. Nilai string yang sesuai dengan salah satu format ISO 8601 juga didukung.
Perhatikan bahwa menggunakan tanda waktu kustom (klausul TIMESTAMP BY) dapat menyebabkan Azure Stream Analytics menyerap peristiwa secara tidak berurutan sehubungan dengan tanda waktu mereka karena dua alasan:
- Masing-masing produsen peristiwa mungkin memiliki jam sistem yang berbeda (dan condong).
- Peristiwa dari produsen peristiwa individu dapat tertunda saat transit, misalnya, oleh ketidaktersebaran jaringan di situs produsen.
Meskipun gangguan antara produsen peristiwa mungkin besar, gangguan dalam peristiwa dari satu produsen umumnya kecil atau bahkan tidak ada. Jika kueri hanya memproses data dari setiap produsen peristiwa secara independen, menangani peristiwa dari setiap produsen dalam garis waktunya sendiri lebih efisien daripada mengelola penyimpangan waktu antar produsen. Azure Stream Analytics mendukung sub-aliran dengan menentukan OVER <atas sub-klausul spesifikasi> untuk memungkinkan pemrosesan peristiwa dalam garis waktu independen. Lihat 'Klausa OVER berinteraksi dengan pengurutan peristiwa' untuk dampak penggunaan klausa OVER pada pemrosesan pekerjaan.
Sintaks
TIMESTAMP BY scalar_expression [OVER <over spec> ]
<over spec> ::=
{ column_name | expression } [,...n ]
Keterangan
Mengambil tanda waktu peristiwa
Tanda waktu peristiwa dapat diambil dalam pernyataan SELECT di bagian mana pun dari kueri menggunakan properti System.Timestamp().
Klausa OVER berinteraksi dengan pengurutan peristiwa
Saat klausa OVER digunakan, beberapa aspek pemrosesan peristiwa oleh Azure Stream Analytics dimodifikasi:
Toleransi maksimum yang tidak berurutan diterapkan dalam satu tuple nilai dari <over spec>. Artinya, peristiwa dianggap tidak berurutan hanya jika tiba terlalu banyak rusak sehubungan dengan peristiwa lain dari produser peristiwa yang sama.
Misalnya, nilai '0' dapat digunakan jika peristiwa dari produsen peristiwa yang sama selalu dipesan dan akan menghasilkan pemrosesan segera. Di sisi lain, menggunakan nilai besar di sini akan memperkenalkan penundaan pemrosesan, sambil menunggu peristiwa yang tidak berurutan untuk dirakit.
Toleransi kedatangan terlambat maksimum diterapkan secara global (seolah-olah OVER tidak digunakan). Artinya, peristiwa dianggap terlambat tiba jika tanda waktu yang dipilih (dalam klausul TIMESTAMP BY) terlalu jauh dari waktu kedatangannya.
Perhatikan bahwa menggunakan nilai besar di sini tidak akan memperkenalkan penundaan pemrosesan dan peristiwa masih akan segera diproses (atau sesuai dengan toleransi maksimum yang tidak berurutan). Nilai beberapa hari tidak masuk akal. Namun, menggunakan nilai yang sangat panjang mungkin berdampak pada jumlah memori yang diperlukan untuk memproses pekerjaan.
Peristiwa output untuk setiap produsen peristiwa dihasilkan saat dihitung, yang berarti bahwa peristiwa output mungkin memiliki tanda waktu yang tidak berurutan; namun, mereka akan berurutan dalam satu nilai tuple dari <spesifikasi> atas.
Batasan dan Pembatasan
Klausa TIMESTAMP BY OVER memiliki batasan penggunaan berikut:
Klausa TIMESTAMP BY OVER harus digunakan untuk semua input kueri atau tidak digunakan untuk salah satunya.
Klausa TIMESTAMP BY OVER hanya didukung dengan pekerjaan paralel sepenuhnya atau pekerjaan partisi tunggal.
Jika aliran input memiliki lebih dari satu partisi, klausa OVER harus digunakan bersama dengan klausa PARTITION BY. Kolom PartitionId harus ditentukan sebagai bagian dari kolom TIMESTAMP BY OVER.
Jika klausa TIMESTAMP BY OVER digunakan, nama kolom dari klausul harus digunakan sebagai kunci pengelompokan dalam pernyataan GROUP BY dan di semua predikat JOIN saat bergabung di antara aliran.
Kolom yang dibuat dalam pernyataan SELECT atau dalam klausa kueri lainnya tidak dapat digunakan dalam klausa TIMESTAMP BY, bidang dari payload input harus digunakan. Misalnya, hasil CROSS APPLY tidak dapat digunakan sebagai nilai target TIMESTAMP BY. Namun, Anda dapat menggunakan satu pekerjaan Azure Stream Analytics yang melakukan CROSS APPLY, dan menggunakan pekerjaan kedua untuk melakukan TIMESTAMP BY.
System.Timestamp() tidak dapat digunakan dalam TIMESTAMP BY, karena TIMESTAMP BY adalah apa yang menetapkan nilai System.Timestamp().
Contoh
Contoh 1 – Mengakses bidang tanda waktu dari payload
Gunakan EntryTime
bidang dari payload sebagai tanda waktu peristiwa
SELECT
EntryTime,
LicensePlate,
State
FROM input TIMESTAMP BY EntryTime
Contoh 2 – Gunakan waktu UNIX dari payload sebagai tanda waktu peristiwa
Sistem UNIX sering menggunakan waktu POSIX (atau Epoch) yang didefinisikan sebagai jumlah milidetik yang telah berlalu sejak 00:00:00 Waktu Universal Terkoordinasi (UTC), Kamis, 1 Januari 1970.
Contoh ini menunjukkan cara menggunakan bidang 'epochtime' numerik yang berisi waktu Epoch sebagai tanda waktu peristiwa.
SELECT
System.Timestamp(),
LicensePlate,
State
FROM input TIMESTAMP BY DATEADD(millisecond, epochtime, '1970-01-01T00:00:00Z')
Contoh 3 – Tanda waktu heterogen
Bayangkan pemrosesan aliran data heterogen yang berisi dua jenis peristiwa 'A' dan 'B'. Peristiwa 'A' memiliki data tanda waktu di bidang 'timestampA' dan peristiwa 'B' memiliki tanda waktu di bidang 'timestampB'.
Contoh ini menunjukkan cara menulis TIMESTAMP BY untuk dapat bekerja dengan kedua jenis peristiwa/tanda waktu.
SELECT
System.Timestamp(),
eventType,
eventValue,
FROM input TIMESTAMP BY
(CASE eventType
WHEN 'A' THEN timestampA
WHEN 'B' THEN timestampB
ELSE NULL END)
Contoh 4 – Menangani beberapa garis waktu dalam kueri yang dipartisi
Memproses data dari pengirim yang berbeda (stasiun tol) tanpa menerapkan kebijakan waktu di berbagai ID stasiun tol. Data input dipartisi berdasarkan TollId.
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY EntryTime OVER TollId, PartitionId
PARTITION BY PartitionId
GROUP BY TUMBLINGWINDOW(minute,3), TollId, PartitionId
Lihat juga
System.Timestamp()
Kebijakan Condong Waktu
Memahami penanganan waktu di Azure Stream Analytics
Waktu Unix