滚动窗口(使用 GROUP BY 组的聚合) - 适用于 SQL 应用程序的 Amazon Kinesis Data Analytics 开发人员指南
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

滚动窗口(使用 GROUP BY 组的聚合)

当一个窗口式查询以非重叠方式处理每个窗口时,这样的窗口称为滚动窗口。在这种情况下,应用程序内部流上的每个记录属于特定窗口。它只处理一次(当查询处理记录所属的窗口时)。

例如,使用 GROUP BY 子句的聚合查询在一个滚动窗口中处理行。入门练习中的演示流接收股票价格数据,而这些数据映射到应用程序中的应用程序内部流 SOURCE_SQL_STREAM_001。这个流具有以下架构。

(TICKER_SYMBOL VARCHAR(4), SECTOR varchar(16), CHANGE REAL, PRICE REAL)

在您的应用程序代码中,假设您希望针对一分钟窗口找到每个股票行情机的聚合(最小、最大)价格。您可以使用以下查询。

SELECT STREAM ROWTIME, Ticker_Symbol, MIN(Price) AS Price, MAX(Price) AS Price FROM "SOURCE_SQL_STREAM_001" GROUP BY Ticker_Symbol, STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);

上述示例是一个基于时间的窗口式查询。该查询根据 ROWTIME 值将记录分组。对于每分钟进行的报告,STEP 函数将 ROWTIME 值向下舍入到最接近的分钟。

注意

您也可以使用 FLOOR 函数将记录分组为不同的窗口。但是,FLOOR 只能将时间值向下舍入到完整的时间单位(小时、分钟、秒等)。建议使用 STEP 以将记录分组为不同的滚动窗口,因为它可以将值向下舍入到任意间隔,例如,30 秒。

该查询是非重叠 (滚动) 窗口示例。GROUP BY 子句在一分钟窗口内对记录进行分组,每个记录属于一个特定窗口 (不重叠)。查询每分钟发送一个输出记录,在其中提供在特定分钟时记录的最小/最大股票行情机价格。在根据输入数据流生成周期性报告时,此类查询很有用。在本示例中,报告是每分钟生成的。

测试查询
  1. 按照入门练习设置应用程序。

  2. 使用先前的 SELECT 查询替换应用程序代码中的 SELECT 语句。下面显示得到的应用程序代码:

    CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( ticker_symbol VARCHAR(4), Min_Price DOUBLE, Max_Price DOUBLE); -- CREATE OR REPLACE PUMP to insert into output CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM Ticker_Symbol, MIN(Price) AS Min_Price, MAX(Price) AS Max_Price FROM "SOURCE_SQL_STREAM_001" GROUP BY Ticker_Symbol, STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);