セッション ウィンドウ

✅ Azure Stream Analytics ✅ Fabric Eventstream

セッション ウィンドウは、同様の時刻に到着するイベントをグループ化し、データがない期間を除外します。 セッション ウィンドウ関数には、タイムアウト、最大期間、パーティション キー (省略可能) の 3 つの主要なパラメーターがあります。

次の図は、一連のイベントを含むストリームと、それらが 5 分のタイムアウトのセッション ウィンドウにどのようにマップされ、最大期間が 10 分であるかを示しています。

Stream Analytics セッション ウィンドウ

セッション ウィンドウは、最初のイベントが発生したときに開始されます。 最後にイベントが取り込まれてから指定されたタイムアウト期間内に別のイベントが発生した場合、ウィンドウはその新しいイベントを含むように拡張されます。 タイムアウト期間内にどのイベントも発生しなかった場合、ウィンドウはタイムアウト時に閉じられます。

指定されたタイムアウト期間内にイベントが発生し続けた場合、セッション ウィンドウは最大期間に達するまで拡張し続けます。 最大期間チェック間隔は、指定された最大期間と同じサイズに設定されることに注意してください。 たとえば、最大期間が 10 の場合、ウィンドウが最大期間を超えているかどうかのチェックは t = 0、10、20、30 などで行われます。つまり、セッション ウィンドウの実際の期間は最大 2 倍の maxDuration になる可能性があります。

したがって、次の条件が満たされると、セッション ウィンドウは数学的に終了します。

セッション ウィンドウの終了条件

パーティション キーが指定されている場合、イベントはそのキーでグループ化され、セッション ウィンドウは各グループに独立に適用されます。 これは、ユーザーやデバイスごとに異なるセッション ウィンドウが必要な場合に便利です。

構文

{SESSIONWINDOW | SESSION} (timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]

{SESSIONWINDOW | SESSION} (Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]

注

セッション ウィンドウは、上記の 2 つの方法で使用できます。

論争

timeunit ウィンドウサイズの時間の単位です。 次の表に、有効なすべての timeunit 引数を示します。

Timeunit 略語
日 dd、d
時間 hh
分 mi、n
秒 ss、s
ミリ秒 さん
マイクロ秒 mcs

timeoutsize

セッション ウィンドウのギャップ サイズを表す大きな整数。 ギャップ サイズ内で発生するデータは、同じウィンドウにグループ化されます。

maxdurationsize

合計ウィンドウ サイズがチェック ポイントで指定された maxDurationSize を超えた場合、ウィンドウは閉じられ、同じ時点で新しいウィンドウが開かれます。 現在、チェック間隔のサイズは maxDurationSize と同じです。

partitionkey

セッション ウィンドウが操作するキーを指定する省略可能なパラメーター。 指定した場合、ウィンドウは同じキーのイベントのみをグループ化します。

例示

次の json データがあるとします。

[
  // time: the timestamp when the user clicks on the link
  // user_id: the id of the user
  // url: the url the user clicked on
  {
    "time": "2017-01-26T00:00:00.0000000z",
    "user_id": 0,
    "url": "www.example.com/a.html"
  },
  {
    "time": "2017-01-26T00:00:20.0000000z",
    "user_id": 0,
    "url": "www.example.com/b.html"
  },
  {
    "time": "2017-01-26T00:00:55.0000000z",
    "user_id": 1,
    "url": "www.example.com/c.html"
  },
  // ...
]

各ユーザー セッションの長さを測定するには、次のクエリを使用します。

CREATE TABLE localinput(time DATETIME, user_id BIGINT, url NVARCHAR(MAX))
SELECT
    user_id,
    MIN(time) AS window_start,
    System.Timestamp() AS window_end,
    DATEDIFF(s, MIN(time), System.Timestamp()) AS duration_in_seconds
FROM localinput TIMESTAMP BY time
GROUP BY user_id, SessionWindow(minute, 2, 60) OVER (PARTITION BY user_id)

上記のクエリでは、タイムアウトが 2 分、最大期間が 60 分、パーティション キーがuser_idのセッション ウィンドウが作成されます。 つまり、user_idごとに独立したセッション ウィンドウが作成されます。 各ウィンドウについて、このクエリは、user_id、ウィンドウの開始時刻 (window_start)、ウィンドウの終了 (window_end) とユーザー セッションの合計期間 (duration_in_seconds) を含む出力を生成します。