本ページでは、リアルタイム計算のスライディングウィンドウ関数を使用する方法について説明します。

リアルタイムコンピューティング HOP ウィンドウ (HOP) は、last_value、first_value、または TopN 関数と一緒には使用できません。

スライディングウィンドウについて

Hop ウィンドウは、スライディングウィンドウとも呼ばれています。 タンブリングウィンドウとは異なり、Hop ウィンドウは互いに重複できます。

スライディングウィンドウには、slide と size の 2 つのパラメーターがあります。 slide パラメーターはスライディングステップの長さを指定し、size パラメーターはウィンドウサイズを指定します。

  • Slide <Size: ウィンドウは互いに重複し、各要素は複数のウィンドウに割り当てられます。
  • Slide = Size: ウィンドウはタンブリングウィンドウです。
  • Slide > Size: ウィンドウは互いに重複しませんが、ギャップによって区切られます。
通常、ほとんどの要素は複数のウィンドウと一致し、ウィンドウは重複しています。 スライディングウィンドウは、移動平均の計算に役立ちます。 たとえば、過去 5 分間のデータ平均を 10 秒ごとに計算するには、slide を 10 秒に、size を 5 分に設定します。 次の図は、slide が 30 秒、size が 1 分のスライディングウィンドウを示しています。Hop ウィンドウ

スライディングウィンドウ関数の構文

HOP 関数は、GROUP BY 句でスライディングウィンドウを定義するために使用されます。

HOP (<time-attr>, <slide-interval>, <size-interval>)
<slide-interval>: INTERVAL 'string' timeUnit
<size-interval>: INTERVAL 'string' timeUnit
			

<time-attr> パラメーターは、time が処理時刻であるかイベント時刻であるかを指定するためのストリームの有効な時刻属性である必要があります。 「ウィンドウ関数の概要」を参照して、時間属性および透かしを定義する方法を習得してください。

ウィンドウ識別子関数

ウィンドウ識別子関数は、ウィンドウの開始または終了時刻、または下位レベルのウィンドウを集約するためのウィンドウ時刻属性を指定します。

ウィンドウ識別子関数 戻り値の型 説明
HOP_START (<time-attr>, <slide-interval>, <size-interval>) TIMESTAMP ウィンドウの開始時刻 (境界値を含む) を返します。 たとえば、ウィンドウが [00:10, 00:15) の場合、00:10 を返します。
HOP_END (<time-attr>, <slide-interval>, <size-interval>) TIMESTAMP ウィンドウの終了時刻 (境界値を含む) を返します。 たとえば、ウィンドウが [00:00, 00:15) の場合、00:15 を返します。
HOP_ROWTIME (<time-attr>, <slide-interval>, <size-interval>) TIMESTAMP (rowtime-attr) ウィンドウの終了時刻 (境界値を除く) を返します。 たとえば、ウィンドウが [00:00, 00:15) の場合、00:14:59.999 を返します。 戻り値は rowtime 属性であり、属性に基づいて、時間タイプの演算を実行できます。 この関数は、イベント時刻に基づくウィンドウにのみ適用できます。
HOP_PROCTIME (<time-attr>, <slide-interval>, <size-interval>) TIMESTAMP (rowtime-attr) ウィンドウの終了時刻 (境界値を除く) を返します。 たとえば、ウィンドウが [00:00, 00:15) の場合、00:14:59.999 を返します。 戻り値は proctime 属性であり、属性に基づいて、時間タイプの演算を実行できます。 この関数は、処理時間に基づくウィンドウでのみ使用できます。

次の例では、過去 1 分間のユーザーごとのクリック数を 30 秒ごとに計算する方法について説明します。 つまり、1 分のウィンドウを 30 秒ごとにスライドさせます。

  • テストデータ
    username(VARCHAR) click_url(VARCHAR) ts(TIMESTAMP)
    Jark http://taobao.com/xxx 2017-10-10 10:00:00.0
    Jark http://taobao.com/xxx 2017-10-10 10:00:10. 0
    Jark http://taobao.com/xxx 2017-10-10 10:00:49. 0
    Jark http://taobao.com/xxx 2017-10-10 10:01:05. 0
    Jark http://taobao.com/xxx 2017-10-10 10:01:58. 0
    Timo http://taobao.com/xxx 2017-10-10 10:02:10. 0
  • テスト文
    Create table user_clicks (
        Username VARCHAR,
        Click_url VARCHAR,
        Ts TIMESTAMP,
        WATERMARK wk FOR ts as withoffset (ts, 2000) -- Define a watermark for rowtime.
    ) WITH (TYPE = 'datahub ',
            ...) ;
    CREATE TABLE hop_output (
        window_start TIMESTAMP,
        window_end TIMESTAMP,
        username VARCHAR,
        clicks BIGINT
    ) WITH (TYPE = 'rds ',
            ...) ;
    INSERT INTO
        hop_output
    SELECT statement
        HOP_START (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE ),
        HOP_END (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE ),
        username,
        COUNT (click_url)
    FROM
        user_clicks
    GROUP BY
        HOP (ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE ),
        username
    					
  • テスト結果
    window_start(TIMESTAMP) window_end(TIMESTAMP) username(VARCHAR) clicks(BIGINT)
    2017-10-10 10:00:00.0 2017-10-10 10:01:00. 0 Jark 3
    2017-10-10 10:00:30. 0 2017-10-10 10:01:30. 0 Jark 2
    2017-10-10 10:01:00. 0 2017-10-10 10:02:00. 0 Jark 2
    2017-10-10 10:01:30. 0 2017-10-10 10:02:30. 0 Jark 1
    2017-10-10 10:01:30. 0 2017-10-10 10:02:30. 0 Timo 1
    2017-10-10 10:02:00. 0 2017-10-10 10:03:00. 0 Timo 1