交错窗口 - SQL适用于应用程序的 Amazon Kinesis Data Analytics 开发者指南

对于新项目,我们建议您使用适用于 Apache Flink Studio 的新托管服务,而不是应用程序版 Kinesis Data Analytics。SQLManaged Service for Apache Flink Studio 不仅操作简单,还具有高级分析功能,使您能够在几分钟内构建复杂的流处理应用程序。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

交错窗口

使用交错窗口 是一种窗口化方法,适用于分析到达时间不一致的数据组。这种方法非常适合任何时间序列分析使用案例,例如一组相关的销售或日志记录。

例如,VPC 流日志具有一个大约 10 分钟的捕获窗口。但是,如果您在客户端上聚合数据,则最多可以具有 15 分钟的捕获窗口。交错窗口非常适合用于聚合这些日志进行分析。

交错窗口解决了多条相关记录不属于同一时间限制窗口的问题,例如在使用了滚动窗口的情况下。

滚动窗口的部分结果

使用滚动窗口聚合延迟或无序数据具有某些限制。

如果使用滚动窗口来分析与时间相关的多组数据,则个别记录可能属于单独的窗口。因此,必须稍后组合每个窗口的部分结果,以便为每组记录生成完整的结果。

在以下滚动窗口查询中,记录按行时间、事件时间和股票代码分组为若干窗口:

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);

在下图中,应用程序根据交易发生的时间(事件时间)以一分钟的粒度计算它收到的交易数量。应用程序可以使用滚动窗口根据行时间和事件时间对数据进行分组。该应用程序接收四条记录,所有记录都在彼此的一分钟之内到达。它按行时间、事件时间和股票代码对记录进行分组。因为一些记录在第一个滚动窗口结束后到达,所以记录并非全部位于同一个一分钟的滚动窗口内。

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

上图包含以下事件。

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

滚动窗口应用程序的结果集类似于以下内容。

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

在前面的结果集中,返回了三个结果:

  • ROWTIME 为 11:01:00 的记录,它聚合前两个记录。

  • 11:02:00 的记录,它仅聚合第三条记录。此记录在第二个窗口中有一个 ROWTIME,但在第一个窗口中有一个 EVENT_TIME

  • 11:02:00 的记录,它仅聚合第四条记录。

要分析完整的结果集,必须在持久性存储中聚合记录。这给应用程序增加了复杂性和处理要求。

完整结果与交错窗口

为了提高分析与时间相关的数据记录的准确性,Kinesis Data Analytics 提供了一种名为交错窗口的新窗口类型。在此窗口类型中,窗口在与分区键匹配的第一个事件到达时打开,而不是在固定的时间间隔打开。窗口根据指定的期限关闭,期限是从窗口打开的时间开始计算的。

交错窗口是窗口子句中每个键分组的单独时间限制窗口。应用程序将窗口子句的每个结果聚合在其自己的时间窗口内,而不是对所有结果使用单个窗口。

在以下交错窗口查询中,记录按事件时间和股票代码分组为若干窗口:

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);

在下图中,事件按事件时间和股票代码聚合到交错窗口中。

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

上图包含以下事件,这些事件与分析的滚动窗口应用程序相同:

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

交错窗口应用程序的结果集类似于以下内容。

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

返回的记录聚合了前三条输入记录。记录按一分钟的交错窗口分组。当应用程序收到第一条 AMZN 记录(ROWTIME 为 11:00:20)时,交错窗口开始。当 1 分钟交错窗口到期时 (11:01:20),对于包含位于交错窗口内的结果(基于 ROWTIMEEVENT_TIME)的记录,将被写入输出流。使用交错窗口,在一分钟窗口内具有 ROWTIMEEVENT_TIME 的所有记录都将在单个结果中发出。

最后一条记录(其 EVENT_TIME 位于一分钟聚合之外)是单独聚合的。这是因为 EVENT_TIME 是用于将记录分成多个结果集的分区键之一,而第一个窗口的 EVENT_TIME 的分区键是 11:00

交错窗口的语法在特殊子句 WINDOWED BY 中定义。对于流式处理聚合,使用此子句代替 GROUP BY 子句。该子句紧跟在可选的 WHERE 子句之后和 HAVING 子句之前。

交错窗口在 WINDOWED BY 子句中定义,并带有两个参数:分区键和窗口长度。分区键对传入的数据流进行分区,并定义窗口何时打开。当流中出现具有唯一分区键的第一个事件时,将打开一个交错窗口。在经过由窗口长度定义的固定时间段之后,交错窗口关闭。以下代码示例说明了此语法:

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