タンブリングウィンドウ (GROUP BY を使用した集計) - Amazon Kinesis Data Analytics for SQL Applications 開発者ガイド

新規プロジェクトでは、Kinesis Data Analytics for SQL よりも 新しい Managed Service for Apache Flink Studio を使用することをお勧めします。Managed Service for Apache Flink Studio は、使いやすさと高度な分析機能を兼ね備えているため、高度なストリーム処理アプリケーションを数分で構築できます。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

タンブリングウィンドウ (GROUP BY を使用した集計)

ウィンドウクエリが各ウィンドウを重複しない方式で処理する場合、ウィンドウは タンブリングウィンドウと呼ばれます。この場合、アプリケーション内ストリームの各レコードは特定のウィンドウに属します。これは 1 回 (そのレコードが属するウィンドウをクエリが処理するとき) のみ処理されます。

たとえば、GROUP BY 句を使用した集計クエリは、タンブリングウィンドウの行を処理します。「使用開始」実習のデモストリームは、アプリケーションのアプリケーション内ストリーム SOURCE_SQL_STREAM_001 にマッピングされた株価データを受信します。このストリームには、次のスキーマがあります。

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

アプリケーションコードで、1 分のウィンドウに対して各ティッカーでの合計 (最低、最高) 価格を検索するとします。以下のクエリを使用できます。

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 分のウィンドウにグループ化されます。各レコードは特定のウィンドウに属します (重複しない)。クエリでは、1 分ごとに 1 つの出力レコードが発行され、特定の分にレコードされた最低/最高ティッカー価格が提供されます。このタイプのクエリは、入力データストリームから定期的にレポートを生成する場合に便利です。この例では、1 分ごとにレポートが生成されます。

クエリをテストするには
  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);