All Products
Search
Document Center

Realtime Compute for Apache Flink:HOP

Last Updated:Jul 06, 2025

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 INTERVAL 'num' timeUnit.

INTERVAL '10' SECOND menunjukkan bahwa interval di mana jendela geser bergerak adalah 10 detik.

size-interval

Ukuran atau durasi jendela geser, yang mendefinisikan rentang waktu yang dicakup oleh setiap jendela. Parameter ini dalam format INTERVAL 'num' timeUnit.

INTERVAL '5' MINUTE menunjukkan bahwa durasi jendela adalah 5 menit.

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

HOP_START(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP

Mengembalikan waktu mulai, termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah [00:10, 00:15], 00:10 dikembalikan.

HOP_END(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP

Mengembalikan waktu akhir, termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah [00:00, 00:15], 00:15 dikembalikan.

HOP_ROWTIME(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP (rowtime-attr)

Mengembalikan waktu akhir, tidak termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah (00:00, 00:15), 00:14:59.999 dikembalikan. Nilai kembali adalah atribut rowtime berdasarkan mana operasi waktu dapat dilakukan. Fungsi ini hanya dapat digunakan dalam jendela yang didefinisikan berdasarkan waktu kejadian, seperti jendela bertingkat. Untuk informasi lebih lanjut, lihat Jendela bertingkat.

HOP_PROCTIME (<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP (rowtime-attr)

Mengembalikan waktu akhir, tidak termasuk nilai batas, dari sebuah jendela. Sebagai contoh, jika rentang waktu jendela adalah (00:00, 00:15), 00:14:59.999 dikembalikan. Nilai kembali adalah atribut waktu pemrosesan berdasarkan mana operasi waktu dapat dilakukan. Fungsi ini hanya dapat digunakan dalam jendela yang didefinisikan berdasarkan waktu pemrosesan, seperti jendela bertingkat. Untuk informasi lebih lanjut, lihat Jendela bertingkat.

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/xxx

    2024-10-10 10:00:00.0

    Jark

    http://taobao.com/xxx

    2024-10-10 10:00:10.0

    Jark

    http://taobao.com/xxx

    2024-10-10 10:00:49.0

    Jark

    http://taobao.com/xxx

    2024-10-10 10:01:05.0

    Jark

    http://taobao.com/xxx

    2024-10-10 10:01:58.0

    Timo

    http://taobao.com/xxx

    2024-10-10 10:02:10.0

  • Pernyataan 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.0

    Jark

    2

    2024-10-10 10:00:00.0

    2024-10-10 10:01:00.0

    Jark

    3

    2024-10-10 10:00:30.0

    2024-10-10 10:01:30.0

    Jark

    2

    2024-10-10 10:01:00.0

    2024-10-10 10:02:00.0

    Jark

    2

    2024-10-10 10:01:30.0

    2024-10-10 10:02:30.0

    Jark

    1

    2024-10-10 10:01:30.0

    2024-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.0

      2024-07-31 09:58:30.0

      2024-07-31 10:00:30.0

      60

      10

      2024-07-31 10:00:00.0

      2024-07-31 09:59:10.0

      2024-07-31 10:00:10.0

    • Baris dengan timestamp 2024-10-10 10:02:30.0 sebenarnya 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)