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.
| Modifikasi | Detail |
|---|---|
| Mengubah atribut window | Termasuk 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 komputasinya | Mempengaruhi status agregasi dalam. Untuk contoh, lihat Modifikasi yang menyebabkan ketidakkompatibelan penuh. |
| Menambah, menghapus, atau memodifikasi bidang agregasi, atau mengubah input ke kueri Top-N | Mengubah skema data yang diberikan ke lapisan ROW_NUMBER. Lihat contoh di bawah. |
| Menambah, menghapus, atau memodifikasi kunci partisi, atau mengubah logika komputasi bidang kunci partisi | Mempengaruhi status ROW_NUMBER lapisan tengah. Untuk contoh, lihat Modifikasi yang tidak kompatibel. |
| Mengubah bidang atau pengurutan dalam klausa ORDER BY | Mempengaruhi logika peringkat dan status. Untuk contoh, lihat Modifikasi yang tidak kompatibel. |
| Mengubah nilai N | N menentukan jumlah hasil berperingkat teratas yang dikembalikan. Untuk contoh, lihat Modifikasi yang tidak kompatibel. |
| Mengubah urutan hanya bidang terkait window TVF dalam klausa GROUP BY | Meskipun 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 BY | Mengubah 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;