Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:Group Window Aggregate

Dernière mise à jour :Aug 09, 2026

Lorsque vous modifiez l'instruction SQL d'un déploiement Realtime Compute for Apache Flink en cours d'exécution, Flink évalue si les données d'état existantes peuvent être réutilisées. Comprendre quelles modifications préservent la compatibilité des états vous aide à éviter toute perte de données inattendue ou un retraitement complet.

Cette rubrique présente les résultats de compatibilité des états pour les instructions SQL qui utilisent des fonctions d'agrégation par fenêtre avec une clause GROUP BY.

Une modification peut avoir trois issues :

  • Entièrement compatible : le déploiement se poursuit en conservant l'intégralité des données d'état historiques.

  • Partiellement compatible : les agrégations non modifiées reprennent à partir de l'état historique ; les agrégations nouvellement ajoutées redémarrent à zéro.

  • Incompatible : le déploiement ne peut réutiliser aucune donnée d'état et doit redémarrer depuis le début.

Comment Flink évalue la compatibilité des états

Flink évalue la réutilisation des états en fonction des composants de l'instruction SQL modifiés :

Composant Flexibilité Exemples
Agrégations non distinctes Flexible — compatibilité partielle possible SUM(b), MAX(c), COUNT(c)
Champs d'attribut de fenêtre Flexible — les modifications sont entièrement compatibles tumble_start, tumble_end
Position de la fonction de fenêtre dans GROUP BY Flexible — le réordonnancement de la clé de fenêtre est entièrement compatible Position de TUMBLE(ts, ...) dans GROUP BY
Définition de la fenêtre Fixe — toute modification rompt la compatibilité Type de fenêtre, taille de fenêtre, attribut temporel
Clés GROUP BY (dimensions statistiques) Fixe — toute modification rompt la compatibilité GROUP BY a, d, ...
Agrégations distinctes Fixe — toute modification rompt la compatibilité COUNT(DISTINCT c)
Paramètres early-fire et late-fire Fixe — toute modification rompt la compatibilité table.exec.emit.early-fire.enabled

Ce cadre explique pourquoi certaines modifications peuvent être partiellement prises en charge (Flink peut supprimer ou ajouter des agrégations individuelles sans reconstruire l'état complet), tandis que d'autres nécessitent un redémarrage complet de l'état (la structure fondamentale du calcul change).

Référence rapide

Utilisez ce tableau pour déterminer l'impact sur la compatibilité d'une modification spécifique avant de l'appliquer.

Modification Compatibilité
Ajout d'une agrégation non distincte Partielle
Suppression d'une agrégation non distincte Totale
Ajout et suppression d'agrégations non distinctes en une seule modification Partielle
Modification d'une agrégation non distincte Partielle
Réordonnancement d'agrégations non distinctes Totale
Modification de la logique de calcul d'un champ dans une agrégation non distincte Partielle
Ajout ou suppression d'un champ d'attribut de fenêtre (tumble_start, tumble_end) Totale
Réordonnancement des clés GROUP BY — seule la position de la clé de fonction de fenêtre change Totale
Aucune agrégation avant ou après la modification Totale
Modification du type de fenêtre (par exemple, TUMBLE vers HOP) Incompatible
Modification de la taille de la fenêtre Incompatible
Modification de l'attribut temporel (rowtime vers proctime, ou inversement) Incompatible
Ajout, suppression ou modification d'une clé GROUP BY (dimension statistique) Incompatible
Ajout, suppression ou modification d'une agrégation distincte Incompatible
Suppression de toutes les agrégations Incompatible
Ajout ou suppression de early-fire ou late-fire Incompatible
Réordonnancement des clés GROUP BY non liées aux fenêtres Incompatible
Ajout d'une agrégation à un déploiement qui n'en contenait aucune Incompatible
Une seule agrégation existe et sa logique de calcul change Incompatible
L'ensemble des agrégations change entièrement (aucun chevauchement) Incompatible
L'instruction SQL contient 'table.exec.emit.early-fire.enabled' = 'true' ou 'table.exec.emit.late-fire.enabled' = 'true' avant ou après la modification Incompatible
L'instruction SQL contient une fonction d'agrégation définie par l'utilisateur Python (UDAF) avant ou après la modification Inconnue

Modifications qui préservent ou préservent partiellement l'état

Ajouter, supprimer ou modifier une agrégation non distincte

Les modifications suivantes entraînent une compatibilité partielle ou totale :

  • Ajout : partiellement compatible. La nouvelle agrégation commence à compter à partir de zéro au redémarrage du déploiement.

  • Suppression : entièrement compatible. Les données d'état de l'agrégation supprimée sont ignorées ; toutes les autres agrégations restent inchangées.

  • Ajout et suppression en une seule modification : partiellement compatible. L'agrégation ajoutée démarre à zéro ; l'état de l'agrégation supprimée est ignoré.

  • Modification (remplacement d'une agrégation par une autre) : partiellement compatible. L'agrégation d'origine est traitée comme supprimée et son état est ignoré ; la nouvelle agrégation est traitée comme ajoutée et démarre à zéro.

Pour les agrégations que vous ne modifiez pas, les résultats après réutilisation de l'état sont identiques aux résultats calculés à partir de l'historique complet des données.
-- Original SQL statement
SELECT a, SUM(b), MAX(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Add COUNT(c): partially compatible.
-- SUM(b) and MAX(c) are unaffected. COUNT(c) starts from 0.
SELECT a, SUM(b), MAX(c), COUNT(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Delete SUM(b): fully compatible.
-- MAX(c) is unaffected.
SELECT a, MAX(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Change MAX(c) to MIN(c): partially compatible.
-- SUM(b) is unaffected. MAX(c) state is discarded; MIN(c) starts from 0.
SELECT a, SUM(b), MIN(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Réordonner des agrégations non distinctes

Le réordonnancement des agrégations dans la liste SELECT n'affecte pas la compatibilité. Tous les résultats restent corrects.

-- Original SQL statement
SELECT a, SUM(b), MAX(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Swap SUM(b) and MAX(c): fully compatible.
SELECT a, MAX(c), SUM(b)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Modifier la logique de calcul d'un champ dans une agrégation non distincte

La modification de la manière dont un champ d'entrée est calculé compte comme une modification de l'agrégation. L'agrégation d'origine est ignorée et la nouvelle démarre à zéro.

-- Original SQL statement
SELECT a, SUM(b), MAX(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Change MAX(c) to MAX(SUBSTRING(c, 1, 5)): partially compatible.
-- SUM(b) is unaffected. MAX(c) state is discarded; MAX(SUBSTRING(c, 1, 5)) starts from 0.
SELECT a, SUM(b), MAX(c)
FROM (SELECT a, b, SUBSTRING(c, 1, 5) AS c FROM MyTable)
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Ajouter ou supprimer un champ d'attribut de fenêtre

L'ajout ou la suppression de tumble_start, tumble_end ou de champs d'attribut de fenêtre similaires est entièrement compatible.

-- Original SQL statement
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Add window_end: fully compatible.
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start,
  tumble_end(ts, INTERVAL '1' MINUTE) AS window_end
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Delete window_start: fully compatible.
SELECT a,
  SUM(b),
  MAX(c)
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Réordonner les clés GROUP BY — uniquement la clé de fonction de fenêtre

Si seule la position de la clé de fonction de fenêtre dans la clause GROUP BY change et que toutes les autres clés conservent le même ordre, la compatibilité est préservée.

-- Original SQL statement
SELECT a, SUM(DISTINCT b), MAX(DISTINCT c), COUNT(c)
FROM MyTable
GROUP BY a, b, TUMBLE(rowtime, INTERVAL '15' MINUTE);

-- Move the window function key: fully compatible.
-- The positions of a and b are unchanged.
SELECT a, SUM(DISTINCT b), MAX(DISTINCT c), COUNT(c)
FROM MyTable
GROUP BY a, TUMBLE(rowtime, INTERVAL '15' MINUTE), b;

Modifications qui rompent la compatibilité des états

Les modifications suivantes rendent un déploiement incompatible avec ses données d'état existantes. Le déploiement doit ignorer tout l'état et recalculer les résultats depuis le début de ses entrées.

Modifier les attributs de fenêtre

La modification du type de fenêtre, de la taille de la fenêtre ou de l'attribut temporel rompt la compatibilité.

-- Original SQL statement
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Change window type from TUMBLE to HOP: incompatible.
SELECT a,
  SUM(b),
  MAX(c),
  hop_start(ts, INTERVAL '1' MINUTE, INTERVAL '2' MINUTE) AS window_start
FROM MyTable
GROUP BY a, HOP(ts, INTERVAL '1' MINUTE, INTERVAL '2' MINUTE);

-- Change window size from 1 minute to 2 minutes: incompatible.
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '2' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '2' MINUTE);

-- Change time attribute from ts (rowtime) to proctime: incompatible.
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(proctime, INTERVAL '1' MINUTE);

Ajouter, supprimer ou modifier une clé GROUP BY

Les clés GROUP BY définissent les dimensions statistiques. Toute modification de ces clés, y compris la modification de la logique de calcul d'un champ utilisé comme clé, rompt la compatibilité.

-- Original SQL statement
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Add GROUP BY key d: incompatible.
SELECT a,
  SUM(b),
  MAX(c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, d, TUMBLE(ts, INTERVAL '1' MINUTE);

Ajouter, supprimer ou modifier une agrégation distincte

Toute modification des agrégations utilisant DISTINCT rompt la compatibilité, même si toutes les autres agrégations restent inchangées.

-- Original SQL statement
SELECT a,
  SUM(b),
  MAX(c),
  COUNT(DISTINCT c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Add COUNT(DISTINCT b): incompatible.
SELECT a,
  SUM(b),
  COUNT(DISTINCT b),
  MAX(c),
  COUNT(DISTINCT c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Supprimer toutes les agrégations

La suppression de chaque agrégation de l'instruction SQL rompt la compatibilité. Tout l'état est ignoré.

-- Original SQL statement
SELECT a,
  SUM(b),
  COUNT(DISTINCT b),
  MAX(c),
  COUNT(DISTINCT c),
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

-- Delete all aggregates: incompatible.
SELECT a,
  tumble_start(ts, INTERVAL '1' MINUTE) AS window_start
FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' MINUTE);

Ajouter ou supprimer early-fire ou late-fire

Toute modification des paramètres d'émission early-fire ou late-fire rompt la compatibilité.

Réordonner les clés GROUP BY non liées aux fenêtres

La modification de l'ordre des clés GROUP BY autres que la clé de fonction de fenêtre rompt la compatibilité.

-- Original SQL statement
SELECT a, SUM(DISTINCT b), MAX(DISTINCT c), COUNT(c)
FROM MyTable
GROUP BY a, b, TUMBLE(rowtime, INTERVAL '15' MINUTE);

-- Swap a and b: incompatible.
SELECT a, SUM(DISTINCT b), MAX(DISTINCT c), COUNT(c)
FROM MyTable
GROUP BY b, a, TUMBLE(rowtime, INTERVAL '15' MINUTE);

Ajouter une agrégation à un déploiement sans agrégations

Si l'instruction SQL d'origine ne contient aucune agrégation et que vous en ajoutez une, la compatibilité est rompue.

-- Original SQL statement (no aggregates)
SELECT a, b, c
FROM MyTable
GROUP BY a, b, c, TUMBLE(rowtime, INTERVAL '15' MINUTE);

-- Add COUNT(c): incompatible.
SELECT a, b, c, COUNT(c)
FROM MyTable
GROUP BY a, b, c, TUMBLE(rowtime, INTERVAL '15' MINUTE);

Une seule agrégation existe et sa logique de calcul change

Si le déploiement comporte exactement une agrégation et que vous modifiez la manière dont elle est calculée, la compatibilité est rompue.

-- Original SQL statement
SELECT a, SUM(b), MAX(b), MAX(c)
FROM MyTable
GROUP BY b, a, TUMBLE(ts, INTERVAL '15' MINUTE);

-- Modify the only remaining aggregate: incompatible.
SELECT a, MAX(c)
FROM (SELECT a, b, c + 1 AS c, ts FROM MyTable)
GROUP BY b, a, TUMBLE(ts, INTERVAL '15' MINUTE);

Les métriques statistiques avant et après la modification sont entièrement différentes

Si aucune agrégation d'avant la modification ne subsiste après celle-ci, la compatibilité est rompue.

-- Original SQL statement
SELECT a, SUM(b), MAX(b), MAX(c) FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' SECOND);

-- Replace with a completely different set of aggregates: incompatible.
SELECT a, MIN(b), AVG(b) FROM MyTable
GROUP BY a, TUMBLE(ts, INTERVAL '1' SECOND);

L'instruction SQL contient une configuration early-fire ou late-fire

Si l'instruction SQL inclut 'table.exec.emit.early-fire.enabled' = 'true' ou 'table.exec.emit.late-fire.enabled' = 'true' soit avant, soit après la modification, la compatibilité est rompue.

-- Original SQL statement
SELECT a, MAX(c)
FROM (SELECT a, b, c + 1 AS c, ts FROM MyTable)
GROUP BY b, a, TUMBLE(ts, INTERVAL '15' MINUTE);

-- Add early-fire or late-fire configuration: incompatible.
SET 'table.exec.emit.early-fire.enabled' = 'true';
SET 'table.exec.emit.early-fire.delay' = '500ms';
-- or
SET 'table.exec.emit.late-fire.enabled' = 'true';
SET 'table.exec.emit.late-fire.delay' = '1s';
SET 'table.exec.emit.allow-lateness' = '5s';

SELECT a, MAX(c)
FROM (SELECT a, b, c + 1 AS c, ts FROM MyTable)
GROUP BY b, a, TUMBLE(ts, INTERVAL '15' MINUTE);

L'instruction SQL contient une UDAF Python

Si l'instruction SQL inclut une fonction d'agrégation définie par l'utilisateur Python (UDAF) soit avant, soit après la modification, la compatibilité entre le déploiement et ses données d'état est inconnue.

-- SQL with a Python UDAF (weighted_avg) before or after modification — compatibility is unknown.
SELECT COUNT(DISTINCT b), a, SUM(DISTINCT b), weighted_avg(a, b)
FROM MyTable
GROUP BY a, c;