セッション ウィンドウ (Azure Stream Analytics)
セッション ウィンドウは、同様の時刻に到着するイベントをグループ化し、データがない期間を除外します。 セッション ウィンドウ関数には、タイムアウト、最大継続時間、パーティション 分割キーの 3 つのメインパラメーターがあります (省略可能)。
次の図は、一連のイベントを含むストリームと、それらが 5 分のタイムアウトのセッション ウィンドウにマップされ、最大時間が 10 分のストリームを示しています。
セッション ウィンドウは、最初のイベントが発生したときに開始されます。 最後にイベントが取り込まれてから指定されたタイムアウト期間内に別のイベントが発生した場合、ウィンドウはその新しいイベントを含むように拡張されます。 タイムアウト期間内にどのイベントも発生しなかった場合、ウィンドウはタイムアウト時に閉じられます。
指定されたタイムアウト期間内にイベントが発生し続けた場合、セッション ウィンドウは最大期間に達するまで拡張し続けます。 最大期間チェック間隔は、指定された最大期間と同じサイズに設定されることに注意してください。 たとえば、最大期間が 10 の場合、ウィンドウが最大期間を超えるかどうかのチェックは、t = 0、10、20、30 などで行われます。つまり、セッション ウィンドウの実際の期間は maxDuration の最大 2 倍になる可能性があります。
したがって、次の条件が満たされると、セッション ウィンドウは数学的に終了します。
パーティション キーが指定されている場合、イベントはそのキーでグループ化され、セッション ウィンドウは各グループに独立に適用されます。 これは、ユーザーやデバイスごとに異なるセッションウィンドウが必要な場合に便利です。
構文
{SESSIONWINDOW | SESSION} (timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]
{SESSIONWINDOW | SESSION} (Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]
Note
セッション ウィンドウは、上記の 2 つの方法で使用できます。
引数
timeunit ウィンドウサイズの時間の単位です。 次の表に有効な timeunit 引数をすべて示します。
Timeunit | 省略形 |
---|---|
day | dd、d |
hour | hh |
minute | mi、n |
second | ss、s |
ミリ秒 | ms |
マイクロ秒 | 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) を含む出力が生成されます。