Stagger Windows - Manuel du développeur des applications Amazon Kinesis Data Analytics pour SQL

Pour les nouveaux projets, nous vous recommandons d’utiliser le nouveau service géré pour Apache Flink Studio plutôt que les applications Kinesis Data Analytics pour SQL. Le service géré pour Apache Flink Studio allie facilité d’utilisation et capacités analytiques avancées, ce qui vous permet de créer des applications sophistiquées de traitement des flux en quelques minutes.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Stagger Windows

Les fenêtres stagger sont une méthode de fenêtrage adaptée à l'analyse des groupes de données qui arrivent à intervalles irréguliers. Elle est idéale pour les cas d'utilisation d'analyse de données chronologiques, comme un ensemble de ventes liées ou d'enregistrements de journaux.

Par exemple, les journaux de flux VPC ont une fenêtre de capture d'environ 10 minutes. Mais elle peut atteindre 15 minutes si vous regroupez des données sur le client. Les fenêtres stagger sont idéales pour agréger ces journaux à des fins d'analyse.

Stagger Windows résout le problème d'enregistrements connexes n'entrant pas dans la même fenêtre de temps, comme lors de l'utilisation de fenêtres à bascule.

Résultats partiels avec les fenêtres à bascule

L'utilisation de Fenêtres bascules pour l'agrégation de données tardives ou obsolètes présente certaines limites.

Si les fenêtres bascules sont utilisées pour analyser les groupes de données connexes, les enregistrements individuels peuvent entrer dans des fenêtres distinctes. Par conséquent, les résultats partiels de chaque fenêtre doivent être combinés ultérieurement pour obtenir les résultats complets pour chaque groupe d'enregistrements.

Dans la requête de fenêtre à bascule suivante, les enregistrements sont regroupés en fenêtres par valeur rowtime, heure d'événement et symbole boursier :

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( TICKER_SYMBOL VARCHAR(4), EVENT_TIME timestamp, TICKER_COUNT DOUBLE); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM TICKER_SYMBOL, FLOOR(EVENT_TIME TO MINUTE), COUNT(TICKER_SYMBOL) AS TICKER_COUNT FROM "SOURCE_SQL_STREAM_001" GROUP BY ticker_symbol, FLOOR(EVENT_TIME TO MINUTE), STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '1' MINUTE);

Dans le schéma suivant, une application compte le nombre de transactions qu'elle reçoit, en fonction de la date à laquelle l'échange s'est produit (événement), avec une minute de granularité. L'application peut utiliser une fenêtre à bascule pour le regroupement des données en fonction de la chronologie et de l'événement. L'application reçoit quatre enregistrements qui arrivent les uns après les autres dans un délai d'une minute. Elle regroupe les enregistrements par valeur rowtime, heure d'événement et symbole boursier. Comme certains enregistrements arrivent après la fin de la première fenêtre à bascule, les enregistrements n'interviennent pas dans la même fenêtre à bascule d'une minute.

Tumbling windows diagram showing data grouping by row time, event time, and ticker symbol over two minutes.

Le schéma précédent comporte les événements suivants.

ROWTIME EVENT_TIME TICKER_SYMBOL
11:00:20 11:00:10 AMZN
11:00:30 11:00:20 AMZN
11:01:05 11:00:55 AMZN
11:01:15 11:01:05 AMZN

L'ensemble de résultats de l'application de fenêtre à bascule se présente comme suit.

ROWTIME EVENT_TIME TICKER_SYMBOL COUNT
11:01:00 11:00:00 AMZN 2
11:02:00 11:00:00 AMZN 1
11:02:00 11:01:00 AMZN 1

Dans le jeu de résultats précédent, trois résultats sont renvoyée :

  • Un enregistrement avec un ROWTIME de 11:01:00 qui regroupe les deux premiers enregistrements.

  • Un enregistrement à 11:02:00 qui regroupe uniquement le troisième enregistrement. Cet enregistrement possède un ROWTIME dans la deuxième fenêtre, mais un EVENT_TIME dans la première fenêtre.

  • Un enregistrement à 11:02:00 qui regroupe uniquement le quatrième enregistrement.

Pour analyser les résultats complets, les enregistrements doivent être regroupés dans le magasin de persistance. Cela ajoute de la complexité et des exigences en matière de traitement à l'application.

Résultats complets avec Stagger Windows

Pour améliorer la précision de l’analyse des enregistrements de données temporelles, Kinesis Data Analytics offre un nouveau type de fenêtre appelé fenêtre Stagger. Dans ce type de fenêtre, les fenêtres s'ouvrent lorsque le premier événement correspondant à la clé de partition se produit, et non pas sur un intervalle de temps fixe. Les fenêtres se ferment en fonction de l'âge spécifié, qui est mesuré à partir du moment où la fenêtre s'est ouverte.

Une fenêtre stagger est une fenêtre distincte limitée dans le temps pour chaque regroupement clé d'une clause de fenêtre. L'application regroupe chaque résultat de la clause de fenêtre à l'intérieur de sa propre fenêtre temporelle, au lieu d'utiliser une seule fenêtre pour tous les résultats.

Dans la requête de fenêtre stagger suivante, les enregistrements sont regroupés en fenêtres par rowtime, heure d'événement et symbole boursier :

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( ticker_symbol VARCHAR(4), event_time TIMESTAMP, ticker_count DOUBLE); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM TICKER_SYMBOL, FLOOR(EVENT_TIME TO MINUTE), COUNT(TICKER_SYMBOL) AS ticker_count FROM "SOURCE_SQL_STREAM_001" WINDOWED BY STAGGER ( PARTITION BY FLOOR(EVENT_TIME TO MINUTE), TICKER_SYMBOL RANGE INTERVAL '1' MINUTE);

Dans le schéma suivant, les enregistrements sont regroupés en fenêtres stagger par heure d'événement et symbole boursier :

Diagram showing event aggregation into stagger windows by event time and ticker symbol.

Le schéma précédent comporte les événements suivants, qui sont les mêmes événements que ceux analysés par l'application de fenêtre à bascule :

ROWTIME EVENT_TIME TICKER_SYMBOL
11:00:20 11:00:10 AMZN
11:00:30 11:00:20 AMZN
11:01:05 11:00:55 AMZN
11:01:15 11:01:05 AMZN

L'ensemble de résultats de l'application de fenêtre stagger se présente comme suit.

ROWTIME EVENT_TIME TICKER_SYMBOL Nombre
11:01:20 11:00:00 AMZN 3
11:02:15 11:01:00 AMZN 1

Les enregistrements retournés regroupent les trois premiers enregistrements d'entrée. Les enregistrements sont regroupés par fenêtres stagger de 1 minute. La fenêtre stagger démarre lorsque l'application reçoit le premier enregistrement AMZN (avec un ROWTIME de 11:00:20). Lorsque la fenêtre stagger de 1 minute expire à 11:01:20, un enregistrement avec les résultats qui se trouvent dans la fenêtre stagger (en fonction de ROWTIME et d'EVENT_TIME) est écrit dans le flux de sortie. À l'aide d'une fenêtre stagger, tous les enregistrements avec un ROWTIME et un EVENT_TIME dans une fenêtre d'une minute sont émis en un seul résultat.

Le dernier enregistrement (avec un EVENT_TIME une fois passée l'agrégation d'une minute) est regroupé séparément. En effet, EVENT_TIME est l'une des clés de partition utilisées pour séparer les enregistrements en jeux de résultats, et la clé de partition EVENT_TIME pour la première fenêtre est 11:00.

La syntaxe d'une fenêtre stagger est définie dans une clause spéciale, WINDOWED BY. Cette clause est utilisée au lieu de la clause GROUP BY pour les regroupements de streaming. La clause s'affiche immédiatement après la clause WHERE facultative et avant la clause HAVING.

La fenêtre stagger est définie par la clause WINDOWED BY et accepte deux paramètres : les clés de partition et la longueur de la fenêtre. Les clés de partition partitionnent les flux de données entrantes et définissent à quel moment la fenêtre s'ouvre. Une fenêtre stagger s'ouvre lorsque le premier événement avec une clé de partition unique s'affiche dans le flux. La fenêtre stagger se ferme après une période définie, par la longueur de la fenêtre. Cette syntaxe est illustrée dans l'exemple de code suivant.

... FROM <stream-name> WHERE <... optional statements...> WINDOWED BY STAGGER( PARTITION BY <partition key(s)> RANGE INTERVAL <window length, interval> );