滚动窗口(使用 GROUP BY 组的聚合) - 适用于 Amazon Kinesis Data Analytics·for·SQL 应用程序开发人员指南

对于新项目,建议您使用新的适用于 Apache Flink Studio 的托管服务,而不是使用 Kinesis Data Analytics for SQL 应用程序。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);