全部产品
Search
文档中心

Realtime Compute for Apache Flink:Agregasi Grup

更新时间:Jun 19, 2025

Topik ini menjelaskan kompatibilitas antara pekerjaan dan data status setelah Anda memodifikasi kueri agregasi grup. Dalam kueri agregasi grup, fungsi agregat digunakan bersama dengan klausa GROUP BY.

Modifikasi yang kompatibel

  • Tambah, hapus, atau ubah bidang teragregasi tanpa kata kunci DISTINCT. Bidang teragregasi dihasilkan dengan menerapkan fungsi agregat ke sekelompok catatan data.

    • Sebagian kompatibel: Menambahkan bidang teragregasi. Nilai dari bidang yang ditambahkan bertambah saat pekerjaan dimulai.

    • Sepenuhnya kompatibel: Menghapus bidang teragregasi yang ada. Data status dari bidang tersebut dibuang.

    • Sebagian kompatibel: Menambahkan bidang teragregasi sambil menghapus bidang teragregasi yang ada. Nilai dari bidang yang ditambahkan bertambah saat pekerjaan dimulai, sedangkan data status dari bidang yang dihapus dibuang.

    • Sebagian kompatibel: Mengubah bidang teragregasi yang ada. Modifikasi ini mencakup penghapusan bidang teragregasi asli dan penambahan bidang teragregasi baru. Nilai dari bidang yang ditambahkan bertambah saat pekerjaan dimulai, sedangkan data status dari bidang yang dihapus dibuang.

    null

    Jika tidak ada perubahan pada bidang teragregasi, hasil perhitungan tetap sama baik menggunakan data status maupun tidak.

    -- Pernyataan SQL asli: 
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Sebagian kompatibel: Tambahkan count(c), yang merupakan bidang teragregasi.
    -- Hasil perhitungan sum(b) dan max(c) tidak terpengaruh. Nilai count(c) bertambah dari 0 saat pekerjaan dimulai.
    SELECT a, SUM(b), MAX(c), COUNT(c) FROM MyTable GROUP BY a;
    
    -- Sepenuhnya kompatibel: Hapus sum(b).
    -- Hasil perhitungan max(c) tidak terpengaruh.
    SELECT a, MAX(c) FROM MyTable GROUP BY a;
    
    -- Sebagian kompatibel: Ubah bidang teragregasi dari max(c) menjadi min(c).
    -- Hasil perhitungan sum(b) tidak terpengaruh. Bidang max(c) dianggap dihapus dan data statusnya dibuang.
    -- Bidang min(c) dianggap sebagai bidang baru dan nilainya bertambah saat pekerjaan dimulai.
    SELECT a, SUM(b), MIN(c) FROM MyTable GROUP BY a;
  • Sepenuhnya kompatibel: Mengubah urutan bidang teragregasi tanpa kata kunci DISTINCT.

    -- Pernyataan SQL asli:
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Sepenuhnya kompatibel: Ubah urutan sum(b) dan max(c).
    -- Hasil perhitungan sum(b) dan max(c) tidak terpengaruh.
    SELECT a, MAX(c), SUM(b) FROM MyTable GROUP BY a;
  • Sebagian kompatibel: Mengubah logika komputasi dari bidang teragregasi tanpa kata kunci DISTINCT. Dalam hal ini, bidang teragregasi dianggap telah dimodifikasi.

    -- Pernyataan SQL asli:
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Sebagian kompatibel: Ubah bidang teragregasi dari max(c) menjadi max(substring(c, 1, 5)). Ini mengubah logika komputasi dengan menerapkan fungsi substring sebelum agregasi.
    -- Hasil perhitungan sum(b) tidak terpengaruh. Bidang max(c) dianggap dihapus dan data statusnya dibuang.
    -- Bidang max(substring(c, 1, 5)) dianggap sebagai bidang teragregasi baru dan nilainya bertambah saat pekerjaan dimulai.
    SELECT a, SUM(b), MAX(c) FROM (
      SELECT a, b, SUBSTRING(c, 1, 5) AS c FROM MyTable
    ) GROUP BY a;
  • Sepenuhnya kompatibel: Memastikan urutan fungsi agregat dengan kata kunci DISTINCT tetap dipertahankan saat mengubah urutan semua fungsi agregat.

    -- Pernyataan SQL asli:
    INSERT INTO MySink
    SELECT a, MAX(b), SUM(DISTINCT b), COUNT(DISTINCT b) FROM MyTable GROUP BY a;
    
    -- Sepenuhnya kompatibel: SUM(DISTINCT b) masih mendahului COUNT(DISTINCT b) setelah modifikasi.
    INSERT INTO MySink
    SELECT a, SUM(DISTINCT b), COUNT(DISTINCT b), MAX(b)  FROM MyTable GROUP BY a;
  • Sepenuhnya kompatibel: Tidak menggunakan bidang teragregasi baik sebelum maupun sesudah modifikasi.

  • Sepenuhnya kompatibel: Menghapus fungsi agregat yang mendukung retraksi setelah operasi retraksi.

    -- Pernyataan SQL asli:
    SELECT c/2, AVG(avg_a) AS avg_avg_a, MAX(max_b) max_max_b FROM
        (SELECT c, MAX(b) AS max_b, AVG(a) AS avg_a FROM MyTable GROUP BY c)
    GROUP BY c/2;
    
    -- Sepenuhnya kompatibel: Hapus fungsi agregat yang mendukung retraksi.
    SELECT c/2, AVG(avg_a) AS avg_avg_a FROM
        (SELECT c, MAX(b) AS max_b, AVG(a) AS avg_a FROM MyTable GROUP BY c)
    GROUP BY c/2;

Modifikasi yang tidak kompatibel

  • Menambah, menghapus, atau mengubah bidang dalam klausa GROUP BY atau mengubah logika komputasi dari bidang tersebut.

    -- Pernyataan SQL asli:
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Tambahkan d dalam klausa GROUP BY.
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a, d;
    
    -- Tidak kompatibel: Hapus a dari klausa GROUP BY dengan menghapus klausa GROUP BY.
    SELECT SUM(b), MAX(c) FROM MyTable;
    
    -- Tidak kompatibel: Ubah bidang dalam klausa GROUP BY dari a menjadi d.
    SELECT d, SUM(b), MIN(c) FROM MyTable GROUP BY d;
    
    -- Tidak kompatibel: Ubah bidang dalam klausa GROUP BY dari a menjadi a + 1.
    SELECT a, SUM(b), MAX(c) FROM (
      SELECT a + 1 AS a, b, c FROM MyTable 
    ) GROUP BY a;
  • Menambah, menghapus, atau mengubah bidang teragregasi dengan kata kunci DISTINCT atau mengubah logika komputasi dari bidang tersebut.

    -- Pernyataan SQL asli:
    SELECT a, SUM(b), MAX(c), SUM(DISTINCT b), COUNT(DISTINCT c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Tambahkan count(distinct b).
    SELECT a, SUM(b), MAX(c), SUM(DISTINCT b), COUNT(DISTINCT b), COUNT(DISTINCT c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Hapus sum(distinct b).
    SELECT a, SUM(b), MAX(c), COUNT(DISTINCT c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Ubah sum(distinct b) menjadi avg(distinct b).
    SELECT a, SUM(b), MAX(c), AVG(DISTINCT b), COUNT(DISTINCT c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Ubah count(distinct c) menjadi count(distinct avg(c)).
    SELECT a, SUM(b), MAX(c), SUM(DISTINCT b), COUNT(DISTINCT c) FROM (
         SELECT a, b, AVG(c) AS c from MyTable GROUP BY a, b
    ) GROUP BY a;
  • Menambahkan bidang teragregasi dalam agregasi multi-level. Hasil perhitungan dari bidang yang ditambahkan tidak dapat diprediksi karena retraksi terjadi dalam agregasi multi-level, sehingga modifikasi ini tidak kompatibel.

    -- Pernyataan SQL asli:
    SELECT a/2, AVG(b), MIN(c) FROM (
        SELECT a, SUM(b) AS b, MAX(c) AS c FROM MyTable GROUP BY a
    ) GROUP BY a/2;
    
    -- Tidak kompatibel: Tambahkan count(c).
    SELECT a/2, AVG(b), MIN(c), COUNT(c) FROM (
        SELECT a, SUM(b) AS b, MAX(c) AS c FROM MyTable GROUP BY a
    ) GROUP BY a/2;
  • Menghapus semua bidang teragregasi. Modifikasi ini tidak kompatibel karena data status dari bidang tersebut dibuang dan tidak ada data status yang dapat digunakan kembali.

    -- Pernyataan SQL asli:
    SELECT a, SUM(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Hapus sum(b) dan max(c).
    SELECT a FROM MyTable GROUP BY a;
  • Mengubah urutan fungsi agregat yang mengandung kata kunci DISTINCT.

    -- Pernyataan SQL asli:
    INSERT INTO MySink
    SELECT a, MAX(b), SUM(DISTINCT b), COUNT(DISTINCT b) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Balikkan urutan SUM(DISTINCT b) dan COUNT(DISTINCT b).
    INSERT INTO MySink
    SELECT COUNT(DISTINCT b), a, MAX(b), SUM(DISTINCT b) FROM MyTable GROUP BY a;
  • Menambahkan bidang teragregasi ke pekerjaan yang sebelumnya tidak melibatkan bidang teragregasi.

    -- Pernyataan SQL asli:
    INSERT INTO MySink
    SELECT a, b FROM MyTable GROUP BY a,b;
    
    -- Tidak kompatibel: Tambahkan bidang teragregasi.
    INSERT INTO MySink
    SELECT a, b, SUM(b) FROM MyTable GROUP BY a,b;
  • Membiarkan hanya satu bidang teragregasi dan mengubah logika komputasi dari bidang tersebut.

    -- Pernyataan SQL asli:
    INSERT INTO MySink
    SELECT a, SUM(b), MAX(b), MAX(c) FROM MyTable GROUP BY a;
    
    -- Tidak kompatibel: Pertahankan hanya bidang MAX(c) dan ubah logika komputasinya.
    INSERT INTO MySink 
    SELECT a, MAX(c) FROM (SELECT a, b, c + 1 AS c, ts FROM MyTable) GROUP BY a;
  • Mengubah semua bidang teragregasi dalam pekerjaan.

    -- Pernyataan SQL asli:
    INSERT INTO MySink
    SELECT a, b, MAX(c) FROM MyTable GROUP BY a,b;
    
    -- Tidak kompatibel: Ubah satu-satunya bidang teragregasi.
    INSERT INTO MySink
    SELECT a, b, MIN(c) FROM MyTable GROUP BY a,b;
  • Menambahkan atau mengubah fungsi agregat yang mendukung retraksi setelah operasi retraksi.

    -- Pernyataan SQL asli:
    SELECT c/2, AVG(avg_a) AS avg_avg_a, MAX(max_b) max_max_b FROM
        (SELECT c, MAX(b) AS max_b, AVG(a) AS avg_a FROM MyTable GROUP BY c)
    GROUP BY c/2;
    
    -- Tidak kompatibel: Tambahkan fungsi agregat yang mendukung retraksi.
    SELECT c/2, AVG(avg_a) AS avg_avg_a, MIN(max_b) min_max_b, MAX(max_b) max_max_b FROM
        (SELECT c, MAX(b) AS max_b, AVG(a) AS avg_a FROM MyTable GROUP BY c)
    GROUP BY c/2;
    
    -- Tidak kompatibel: Ubah fungsi agregat yang mendukung retraksi.
    SELECT c/2, AVG(avg_a) AS avg_avg_a, MIN(max_b) max_max_b FROM
        (SELECT c, MAX(b) AS max_b, AVG(a) AS avg_a FROM MyTable GROUP BY c)
    GROUP BY c/2;

Modifikasi yang menghasilkan kompatibilitas yang tidak diketahui

Jika Anda menggunakan fungsi agregat yang didefinisikan pengguna Python (UDAF) sebelum atau sesudah modifikasi, sistem tidak dapat menentukan tingkat kompatibilitas.

-- Kompatibilitas tidak diketahui: Gunakan Python UDAF, seperti fungsi weighted_avg yang ditunjukkan dalam kode berikut, sebelum atau sesudah modifikasi.
SELECT a, MAX(b), SUM(DISTINCT b), COUNT(DISTINCT b), weighted_avg(a, b) 
FROM MyTable GROUP BY a, b;