Für neue Projekte empfehlen wir, den neuen Managed Service für Apache Flink Studio anstelle von Kinesis Data Analytics for SQL Applications zu verwenden. Der Managed Service für Apache Flink Studio kombiniert Benutzerfreundlichkeit mit fortschrittlichen Analysefunktionen, sodass Sie in wenigen Minuten anspruchsvolle Anwendungen zur Stream-Verarbeitung erstellen können.
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Versetzte Fenster
Das Verwenden von Versetzte Fenster ist eine Methode zur Anordnung von Fenstern für die Analyse von Datengruppen, die ungleichmäßig eingehen. Diese Methode eignet sich für beliebige Zeitreihenanalysen, z. B. für eine Gruppe zusammengehöriger Verkaufs- oder Protokolldatensätze.
Beispiel: VPC Flow Logs haben einen Erfassungszeitraum von ca. 10 Minuten. Sie können jedoch einen Erfassungszeitraum von bis zu 15 Minuten aufweisen, wenn das Aggregieren von Daten auf dem Client erfolgt. Versetzte Fenster eignen sich ideal, um diese Protokolle zu Analysezwecken zu aggregieren.
Versetzte Fenster lösen das Problem, das auftritt, wenn zusammengehörige Datensätze nicht in dasselbe zeitbeschränkte Fenster fallen (beispielsweise bei Verwendung rollierender Fenster).
Teilergebnisse mit rollierenden Fenstern
Bei der Verwendung von Rollierende Fenster zum Aggregieren von Daten, die verspätet oder ungeordnet ankommen, gibt es einige Einschränkungen.
Wenn rollierende Fenster zum Analysieren von Gruppen zeitversetzter Daten verwendet werden, fallen die einzelnen Datensätze möglicherweise in unterschiedliche Fenster. Daher müssen die Teilergebnisse jedes Fensters zu einem späteren Zeitpunkt kombiniert werden, um vollständige Ergebnisse für jede Gruppe von Datensätzen anzuzeigen.
In der folgenden Abfrage für rollierende Fenster werden Datensätze nach Zeilenzeit, Ereigniszeit und Tickersymbol in Fenstern gruppiert:
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);
In der folgenden Abbildung zählt eine Anwendung die empfangenen Handelstransaktionen basierend auf dem Zeitpunkt der Transaktionen (Ereigniszeit) minutenweise. Die Anwendung kann ein rollierendes Fenster zum Gruppieren der Daten basierend auf Zeilenzeit und Ereigniszeit verwenden. Die Anwendung empfängt vier Datensätze, die alle innerhalb einer Minute eintreffen. Die Anwendung gruppiert die Datensätze nach Zeilenzeit, Ereigniszeit und Tickersymbol. Da einige der Datensätze nach dem Ende des ersten rollierenden Fensters ankommen, fallen nicht alle Datensätze in dasselbe rollierende Ein-Minuten-Fenster.
![Tumbling windows diagram showing data grouping by row time, event time, and ticker symbol over two minutes.](images/stagger_0.png)
Das vorhergehende Diagramm enthält die folgenden Ereignisse:
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 |
Die Ergebnismenge der Anwendung mit rollierendem Fenster ähnelt der folgenden.
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 |
In der Ergebnismenge werden drei Ergebnisse zurückgegeben:
Ein Datensatz mit einem
ROWTIME
-Wert von 11:01:00, der die ersten zwei Datensätze aggregiert.Ein Datensatz um 11:02:00, der nur den dritten Datensatz aggregiert. Dieser Datensatz weist einen
ROWTIME
-Wert im zweiten Fenster, aber einenEVENT_TIME
-Wert im ersten Fenster auf.Ein Datensatz um 11:02:00, der nur den vierten Datensatz aggregiert.
Zum Analysieren der vollständigen Ergebnismenge müssen die Datensätze im persistenten Speicher aggregiert werden. Dadurch wachsen Komplexität und Verarbeitungsanforderungen der Anwendung.
Vollständige Ergebnisse mit versetzten Fenstern
Zur Verbesserung der Genauigkeit bei der Analyse zeitbezogener Datensätze stellt Kinesis Data Analytics einen neuen Fenstertyp mit der Bezeichnung Versetzte Fenster bereit. Fenster dieses Typs werden geöffnet, wenn das erste Ereignis mit übereinstimmendem Partitionsschlüssel ankommt, nicht für einen festen Zeitraum. Die Fenster werden basierend auf dem angegebenen Alter geschlossen, das ab dem Zeitpunkt gemessen wird, zu dem das Fenster geöffnet wird.
Ein versetztes Fenster ist ein separates zeitbeschränktes Fenster für jede Schlüsselgruppierung in einer WINDOW-Klausel. Die Anwendung aggregiert jedes Ergebnis der WINDOW-Klausel im eigenen Zeitfenster, statt ein einzelnes Fenster für alle Ergebnisse zu verwenden.
In der folgenden Abfrage für versetzte Fenster werden Datensätze nach Ereigniszeit und Tickersymbol in Fenstern gruppiert:
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);
Im folgenden Diagramm werden Ereignisse nach Ereigniszeit und Tickersymbol in versetzten Fenstern gruppiert.
![Diagram showing event aggregation into stagger windows by event time and ticker symbol.](images/stagger_1.png)
Das vorstehende Diagramm umfasst die folgenden Ereignisse, die denen entsprechen, die mit der Anwendung mit rollierenden Fenstern analysiert wurden:
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 |
Die Ergebnismenge der Anwendung für versetzte Fenster ähnelt der folgenden.
ROWTIME | EVENT_TIME | TICKER_SYMBOL | Anzahl |
---|---|---|---|
11:01:20 | 11:00:00 | AMZN | 3 |
11:02:15 | 11:01:00 | AMZN | 1 |
Der zurückgegebene Datensatz aggregiert die ersten drei Eingabedatensätze. Die Datensätze werden nach versetzten Eine-Minute-Fenstern gruppiert. Das versetzte Fenster startet, wenn die Anwendung den ersten AMZN-Datensatz (mit einem ROWTIME
-Wert von 11:00:20) empfängt. Wenn das versetzte Eine-Minute-Fenster abläuft (um 11:01:20), wird ein Datensatz mit den Ergebnissen, die in das versetzte Fenster fallen (basierend auf ROWTIME
und EVENT_TIME
), in den Ausgabe-Stream geschrieben. Bei Verwendung eines versetzten Fensters werden alle Datensätze mit ROWTIME
- und EVENT_TIME
-Werten innerhalb eines Eine-Minute-Fensters in einem einzelnen Ergebnis ausgegeben.
Der letzte Datensatz (mit einer EVENT_TIME
außerhalb der einminütigen Aggregation) wird separat aggregiert. Dies liegt daran, dass EVENT_TIME
einen der Partitionsschlüssel darstellt, mit dem die Datensätze in Ergebnissätze eingeteilt werden, und der Partitionsschlüssel für die EVENT_TIME
des ersten Fensters 11:00
ist.
Die Syntax für versetzte Fenster wird in einer speziellen WINDOWED BY
-Klausel definiert. Diese Klausel wird anstelle der GROUP BY
-Klausel für Streaming-Aggregationen verwendet. Die Klausel folgt unmittelbar auf die optionale WHERE
-Klausel und steht vor der HAVING
-Klausel.
Das versetzte Fenster wird in der WINDOWED BY
-Klausel definiert und nimmt zwei Parameter an: Partitionsschlüssel und Fensterdauer. Der Partitionsschlüssel partitioniert den eingehenden Daten-Stream und definiert, wann das Fenster geöffnet wird. Ein versetztes Fenster wird geöffnet, sobald das erste Ereignis mit eindeutigem Partitionsschlüssel im Stream auftritt. Das versetzte Fenster schließt nach einem festen Zeitraum, der als Fensterdauer definiert ist. Die Syntax wird im folgenden Codebeispiel veranschaulicht:
... FROM <stream-name> WHERE <... optional statements...> WINDOWED BY STAGGER( PARTITION BY <partition key(s)> RANGE INTERVAL <window length, interval> );