Topik ini menjelaskan cara menggunakan fungsi HOP di Realtime Compute for Apache Flink.
Definisi
Fungsi HOP digunakan untuk mendefinisikan jendela melompat, yang juga dikenal sebagai jendela geser. Tidak seperti jendela bergulir, jendela geser dapat saling tumpang tindih.
Sintaksis
Anda dapat menggunakan fungsi HOP dalam klausa GROUP BY untuk mendefinisikan jendela geser.
HOP(<time-attr>, <slide-interval>,<size-interval>) Parameter input
Parameter | Deskripsi | Contoh |
time-attr | Parameter ini harus berupa bidang atribut waktu yang valid dalam sebuah aliran. Parameter ini menentukan apakah waktu tersebut adalah waktu pemrosesan atau waktu peristiwa. Untuk informasi lebih lanjut, lihat Atribut waktu. | - |
slide-interval | Interval di mana jendela geser bergerak, yang mendefinisikan perbedaan waktu antara jendela berturut-turut. Parameter ini dalam format |
|
size-interval | Ukuran atau durasi jendela geser, yang mendefinisikan rentang waktu yang dicakup oleh setiap jendela. Parameter ini dalam format |
|
Jendela geser dapat digunakan dalam skenario berikut berdasarkan nilai parameter slide-interval dan size-interval:
Jika kondisi slide-interval < size-interval terpenuhi, jendela akan saling tumpang tindih dan setiap elemen ditetapkan ke beberapa jendela.
Jika kondisi slide-interval = size-interval terpenuhi, jendela tersebut adalah jendela bergulir.
Jika kondisi slide-interval > size-interval terpenuhi, jendela tersebut adalah jendela geser. Jendela-jendela ini tidak saling tumpang tindih dan dipisahkan oleh celah.
Dalam sebagian besar kasus, sebagian besar elemen ditetapkan ke beberapa jendela dan jendela-jendela tersebut saling tumpang tindih. Jendela geser sangat cocok untuk menghitung rata-rata bergerak. Sebagai contoh, jika Anda ingin menghitung rata-rata data dalam 5 menit terakhir setiap 10 detik, atur slide-interval menjadi 10 detik dan atur size-interval menjadi 5 menit.
Fungsi pengidentifikasi jendela
Fungsi pengidentifikasi jendela menentukan waktu mulai, waktu akhir, atau atribut waktu dari sebuah jendela. Atribut waktu digunakan untuk menggabungkan jendela tingkat lebih rendah.
Fungsi | Tipe nilai kembali | Deskripsi |
| TIMESTAMP | Mengembalikan waktu mulai, termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah |
| TIMESTAMP | Mengembalikan waktu akhir, termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah |
| TIMESTAMP (rowtime-attr) | Mengembalikan waktu akhir, tidak termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah |
| TIMESTAMP (rowtime-attr) | Mengembalikan waktu akhir, tidak termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah |
Contoh
Dalam contoh berikut, jendela 1 menit bergeser sekali setiap 30 detik. Anda dapat menggunakan jendela-jendela tersebut untuk menghitung jumlah klik per pengguna selama satu menit terakhir setiap 30 detik.
Data uji dalam tabel user_clicks
username (VARCHAR)
click_url (VARCHAR)
eventtime (VARCHAR)
Jark
http://taobao.com/xxx2024-10-10 10:00:00.0Jark
http://taobao.com/xxx2024-10-10 10:00:10.0Jark
http://taobao.com/xxx2024-10-10 10:00:49.0Jark
http://taobao.com/xxx2024-10-10 10:01:05.0Jark
http://taobao.com/xxx2024-10-10 10:01:58.0Timo
http://taobao.com/xxx2024-10-10 10:02:10.0Pernyataan uji
CREATE TEMPORARY TABLE user_clicks ( username VARCHAR, click_url VARCHAR, eventtime VARCHAR, ts AS TO_TIMESTAMP(eventtime), WATERMARK FOR ts AS ts - INTERVAL '2' SECOND -- Definisikan watermark untuk rowtime. ) WITH ( 'connector' = 'kafka', 'topic' = '<yourTopic>', 'properties.bootstrap.servers' = '<brokers>', 'scan.startup.mode' = 'earliest-offset', 'format' = 'csv' ); CREATE TEMPORARY TABLE hop_output ( window_start TIMESTAMP, window_end TIMESTAMP, username VARCHAR, clicks BIGINT ) WITH ( 'connector'='print', 'logger'='true' ); INSERT INTO hop_output SELECT HOP_START (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), HOP_END (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), username, COUNT (click_url) FROM user_clicks GROUP BY HOP (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),username;Hasil uji
window_start (TIMESTAMP)
window_end (TIMESTAMP)
username (VARCHAR)
clicks (BIGINT)
2024-10-10 09:59:30.0①2024-10-10 10:00:30.0Jark
2
2024-10-10 10:00:00.02024-10-10 10:01:00.0Jark
3
2024-10-10 10:00:30.02024-10-10 10:01:30.0Jark
2
2024-10-10 10:01:00.02024-10-10 10:02:00.0Jark
2
2024-10-10 10:01:30.02024-10-10 10:02:30.0②Jark
1
2024-10-10 10:01:30.02024-10-10 10:02:30.0②Timo
1
Catatan①Jika jendela geser tidak dapat membaca waktu saat data masuk ke jendela, waktu mulai jendela pertama dimundurkan. Anda dapat menggunakan rumus berikut untuk menghitung interval waktu di mana waktu mulai dimundurkan: Interval waktu = Durasi jendela - Langkah geser.
Durasi jendela (detik)
Langkah geser (detik)
Waktu kejadian
Waktu mulai jendela pertama
Waktu akhir jendela pertama
120
30
2024-07-31 10:00:00.02024-07-31 09:58:30.02024-07-31 10:00:30.060
10
2024-07-31 10:00:00.02024-07-31 09:59:10.02024-07-31 10:00:10.0②Baris dengan timestamp
2024-10-10 10:02:30.0sebenarnya tidak terlihat dalam hasil, karena perhitungan jendela belum dipicu. Diperlukan satu catatan tambahan dari pengguna mana pun untuk memicu perhitungan jendela.Waktu pemicu perhitungan jendela ≥
window_end + Watermark(seperti 10:02:32.0)