このトピックでは、Realtime Compute のセッションウィンドウ関数を使用する方法について説明します。

セッションウィンドウについて

セッションウィンドウは、セッションのアクティビティごとに要素をグループ化するものです。 タンブリングウィンドウやスライディングウィンドウとは異なり、セッションウィンドウは重複せず、サイズも固定されていません。 セッションウィンドウで一定期間内に要素が受信されない場合、セッションは切断され、ウィンドウは閉じられます。

セッションウィンドウは、ギャップを使用して構成され、アクティブでない期間の長さが定義されます。 たとえば、マウスをクリックするアクティビティを表すデータストリームには、高度にクラスター化されたマウスのクリックイベントが含まれ、アイドル期間で区切られます。 指定した最短のギャップの後にデータが到着すると、新しいウィンドウが開きます。

下図に、セッションウィンドウを示します。 データ分布の違いにより、キーごとに異なるウィンドウがあることにご注意ください。

セッションウィンドウ関数の構文

SESSION 関数は、GROUP BY 句のセッションウィンドウを定義するために使用されます。

SESSION(<time-attr>, <gap-interval>)
<gap-interval>: INTERVAL 'string' timeUnit
			

<time-attr data-spm-anchor-id="a2762.11472859.0.i151.7ca4203bEk6mXa"><time-attr> パラメーターは、時刻が処理時刻であるかイベント時刻であるかを指定するためのストリームの有効な時刻属性である必要があります。</time-attr>時刻属性および透かしを定義する方法の詳細については、「ウィンドウ関数の概要」をご参照ください。

ウィンドウ識別子関数

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

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

以下の例は、アクティブなセッションごとにユーザーあたりのクリック数を計算する方法を示しています。 セッションタイムアウト間隔は 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
  • Test statements
    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 session_output(
    window_start TIMESTAMP,
    window_end TIMESTAMP,
    username VARCHAR,
    clicks BIGINT
    ) with (
    type='rds'
    );
    
    INSERT INTO session_output
    SELECT
    SESSION_START(ts, INTERVAL '30' SECOND),
    SESSION_END(ts, INTERVAL '30' SECOND),
    username,
    COUNT(click_url)
    FROM user_clicks
    GROUP BY SESSION(ts, INTERVAL '30' SECOND), username
    					
  • テスト結果
    window_start (TIMESTAMP) window_end (TIMESTAMP) username (VARCHAR) clicks (BIGINT)
    2017-10-10 10:00:00.0 2017-10-10 10:00:40.0 Jark 2
    2017-10-10 10:00:49.0 2017-10-10 10:01:35.0 Jark 2
    2017-10-10 10:01:58.0 2017-10-10 10:02:28.0 Jark 1
    2017-10-10 10:02:10.0 2017-10-10 10:02:40.0 Timo 1