All Products
Search
Document Center

Realtime Compute for Apache Flink:Fungsi Window Top-N

Last Updated:Mar 26, 2026

Window Top-N harus mematuhi aturan modifikasi dari fungsi bernilai tabel (TVF) window dan kueri Top-N secara bersamaan. Karena kedua set aturan ini berlaku, Window Top-N mendukung lebih sedikit modifikasi yang kompatibel dibandingkan TVF window atau kueri Top-N yang berdiri sendiri. Topik ini menjelaskan modifikasi mana pada kueri Window Top-N yang kompatibel dengan data status pekerjaan yang sudah ada, serta modifikasi mana yang memerlukan pengaturan ulang penuh status sebelum pekerjaan dapat dijalankan ulang.

Mengapa beberapa modifikasi merusak kompatibilitas status

Saat Anda memodifikasi kueri Window Top-N, Pengoptimal kueri Flink mungkin menghasilkan rencana eksekusi yang berbeda—mengubah topologi Operator atau skema status suatu Operator perantara. Jika rencana baru tidak lagi sesuai dengan titik simpan yang ada, pekerjaan tidak dapat dilanjutkan dari status sebelumnya.

Modifikasi apa pun yang mengubah atribut window, bidang GROUP BY, kunci partisi, bidang ORDER BY, nilai N, atau bidang agregasi akan memicu perencanaan ulang dan menyebabkan ketidakkompatibelan status.

Struktur sintaksis Window Top-N

Memahami klausa mana yang menjadi target setiap modifikasi membantu Anda menerapkan aturan kompatibilitas di bawah ini. Struktur kueri Window Top-N adalah:

-- Kueri luar: pilih baris dengan peringkat tertinggi
SELECT [column_list]
FROM (
  -- Lapisan tengah: tetapkan nomor baris menggunakan ROW_NUMBER()
  SELECT [column_list],
    ROW_NUMBER() OVER (
      PARTITION BY window_start, window_end [, partition_key...]
      ORDER BY col [ASC|DESC] [, col [ASC|DESC]...]
    ) AS rk
  FROM (
    -- Kueri dalam: agregasi window menggunakan window TVF
    SELECT [agg_fields], window_start, window_end
    FROM TABLE(TUMBLE(TABLE source_table, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY [group_keys], window_start, window_end
  )
)
WHERE rk < N;

Aturan kompatibilitas di bawah ini dipetakan ke klausa spesifik dalam struktur ini.

Modifikasi yang kompatibel

Modifikasi berikut sepenuhnya kompatibel dengan data status yang sudah ada. Anda dapat menerapkannya tanpa mengatur ulang status pekerjaan.

Tambah atau hapus bidang atribut window dari hasil kueri

Menambahkan atau menghapus window_start atau window_end dari daftar SELECT luar tidak memengaruhi struktur status internal.

-- Asli: hanya memilih window_start
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

-- Kompatibel: tambahkan window_end ke output
SELECT a, b, c, window_start, window_end FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

Sertakan atau tidak sertakan bidang posisi peringkat dalam hasil kueri

Menyertakan atau tidak menyertakan bidang rk (output ROW_NUMBER) dalam SELECT luar sepenuhnya kompatibel.

-- Asli: rk tidak termasuk dalam output
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

-- Kompatibel: sertakan rk dalam output
SELECT a, b, c, window_start, rk FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

Ubah urutan kunci partisi dalam klausa OVER

Mengubah urutan kunci partisi dalam PARTITION BY tidak mengubah logika partisi atau struktur status.

-- Asli: PARTITION BY a, b, window_start, window_end
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY a, b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, b, window_start, window_end
  )
) WHERE rk < 3;

-- Kompatibel: ubah urutan menjadi PARTITION BY b, a, window_start, window_end
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, a, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, b, window_start, window_end
  )
) WHERE rk < 3;

Modifikasi yang tidak kompatibel

Modifikasi berikut tidak kompatibel dengan data status yang sudah ada. Setelah melakukan perubahan ini, Anda harus mengatur ulang status pekerjaan sebelum menjalankannya kembali.

ModifikasiDetail
Mengubah atribut windowTermasuk tipe window, ukuran window, atau atribut waktu. Untuk contoh, lihat Modifikasi yang menyebabkan ketidakkompatibelan penuh.
Menambah, menghapus, atau memodifikasi bidang dalam klausa GROUP BY, atau mengubah logika komputasinyaMempengaruhi status agregasi dalam. Untuk contoh, lihat Modifikasi yang menyebabkan ketidakkompatibelan penuh.
Menambah, menghapus, atau memodifikasi bidang agregasi, atau mengubah input ke kueri Top-NMengubah skema data yang diberikan ke lapisan ROW_NUMBER. Lihat contoh di bawah.
Menambah, menghapus, atau memodifikasi kunci partisi, atau mengubah logika komputasi bidang kunci partisiMempengaruhi status ROW_NUMBER lapisan tengah. Untuk contoh, lihat Modifikasi yang tidak kompatibel.
Mengubah bidang atau pengurutan dalam klausa ORDER BYMempengaruhi logika peringkat dan status. Untuk contoh, lihat Modifikasi yang tidak kompatibel.
Mengubah nilai NN menentukan jumlah hasil berperingkat teratas yang dikembalikan. Untuk contoh, lihat Modifikasi yang tidak kompatibel.
Mengubah urutan hanya bidang terkait window TVF dalam klausa GROUP BYMeskipun bidang GROUP BY non-window tetap sama, mengubah urutan window_start dan window_end mengubah hasil peringkat berbasis window dan tidak kompatibel. Lihat contoh di bawah.
Mengubah urutan hanya bidang non-window dalam klausa GROUP BYMengubah urutan bidang non-window (misalnya, menukar a dan b) mengubah status agregasi dalam dan tidak kompatibel. Lihat contoh di bawah.

Contoh: menambahkan bidang agregasi

Menambahkan min(d) AS d ke agregasi dalam mengubah skema input kueri Top-N dan merusak kompatibilitas status.

-- Asli
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

-- Tidak kompatibel: menambahkan min(d) sebagai d, mengubah input Top-N
SELECT a, b, c, d, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, min(d) AS d, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, window_start, window_end
  )
) WHERE rk < 3;

Contoh: mengubah urutan bidang GROUP BY

Kedua modifikasi berikut tidak kompatibel, meskipun tidak ada bidang yang ditambahkan atau dihapus.

-- Asli
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, b, window_start, window_end
  )
) WHERE rk < 3;

-- Tidak kompatibel: mengubah urutan bidang window TVF (window_end sebelum window_start)
-- Ini mengubah hasil peringkat berbasis window.
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY a, b, window_end, window_start
  )
) WHERE rk < 3;

-- Tidak kompatibel: mengubah urutan bidang non-window (b sebelum a)
SELECT a, b, c, window_start FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY b, window_start, window_end ORDER BY c) AS rk
  FROM (
    SELECT a, sum(b) AS b, max(c) AS c, window_start, window_end
    FROM TABLE(tumble(TABLE MyTable, DESCRIPTOR(ts), INTERVAL '1' MINUTE))
    GROUP BY b, a, window_start, window_end
  )
) WHERE rk < 3;

Langkah selanjutnya