ウィンドウ関数について
ストリーム処理の一般的な目標は、イベントを時間的な間隔つまり "ウィンドウ" に集計することです。 たとえば、1 分あたりのソーシャル メディアの投稿数をカウントしたり、1 時間あたりの平均降水量を計算したりします。
Azure Stream Analytics には、5 種類のテンポラル ウィンドウ関数のネイティブ サポートが含まれています。 これらの関数を使用すると、クエリでデータを集計する時間間隔を定義できます。 サポートされているウィンドウ関数は、タンブリング、ホッピング、スライディング、セッション、スナップショットです。
タンブリング
タンブリング ウィンドウ関数を使用すると、データ ストリームが連続した一連の固定サイズの重複しない時間セグメントに分割され、それらに対して操作が行われます。 イベントは、複数のタンブリング ウィンドウに属することはできません。
次のクエリで表されるタンブリング ウィンドウの例では、各 1 分間のウィンドウ内の最大読み取り値を検索します。 ウィンドウ関数は、クエリ構文の GROUP BY 句を使用して Stream Analytics ジョブに適用されます。 次のクエリの GROUP BY
句には、1 分のウィンドウ サイズを指定する TumblingWindow()
関数が含まれています。
SELECT DateAdd(minute,-1,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY TumblingWindow(minute, 1)
Hopping
ホッピング ウィンドウ関数を使用すると、スケジュールされた重複するウィンドウがモデル化され、一定の間隔で時間が進められます。 重複することができ、ウィンドウ サイズより頻繁に出力されるタンブリング ウィンドウと考えるのが最も簡単です。 実際、タンブリング ウィンドウは、hop
が size
と等しいホッピング ウィンドウにすぎません。 ホッピング ウィンドウを使用すると、同じイベントが複数のウィンドウの結果セットに属する可能性があります。
ホッピング ウィンドウを作成するには、3 つのパラメーターを指定する必要があります。 1 番目のパラメーターは、秒、分、時などの時間単位を示します。 次のパラメーターでは、ウィンドウのサイズを設定します。これは、各ウィンドウの長さを指定します。 最後に必要なパラメーターはホップ サイズです。これは、各ウィンドウが前のウィンドウに対してどの程度前方に移動するかを指定します。 オフセット サイズを示す 4 番目の省略可能なパラメーターも使用できます。
次のクエリでは、timeunit
を second
に設定して HoppingWindow()
が使用されています。 windowsize
は 60 秒で、hopsize
は 30 秒です。 このクエリを使用すると、30 秒ごとに、過去 60 秒間に発生した最大読み取り値を含むイベントが出力されます。
SELECT DateAdd(second,-60,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY HoppingWindow(second, 60, 30)
スライディング
スライディング ウィンドウを使用すると、ウィンドウの内容が実際に変化した時点でイベントが生成されます。 この関数モデルでは、考慮する必要があるウィンドウの数が制限されます。 Azure Stream Analytics では、イベントがウィンドウに入るか出るかした時点でのみ、イベントが出力されます。 そのため、すべてのウィンドウに少なくとも 1 つのイベントが含まれています。 スライディング ウィンドウのイベントは、ホッピング ウィンドウと同様に、複数のスライディング ウィンドウに属することができます。
次のクエリでは、SlidingWindow()
関数を使って、イベントが発生した各 1 分間のウィンドウ内の最大読み取り値を検索します。
SELECT DateAdd(minute,-1,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY SlidingWindow(minute, 1)
Session
セッション ウィンドウ関数を使用すると、似た時刻に到着したイベントがクラスター化され、データが存在しない期間がフィルターで除外されます。 これには、タイムアウト、最大期間、パーティション分割キー (省略可能) の 3 つの主なパラメーターがあります。
最初のイベントが発生すると、セッション ウィンドウが開始されます。 最後に取り込まれたイベントから、指定したタイムアウト期間内に、別のイベントが発生したとします。 その場合、新しいイベントを含むようにウィンドウが拡張されます。 ただし、指定したタイムアウト期間内に他のイベントが発生しなかった場合は、タイムアウトの時点でウィンドウが閉じられます。 指定したタイムアウト期間内にイベントが発生し続けた場合、セッション ウィンドウは最大期間に達するまで拡張され続けます。
次のクエリを使用すると、20 秒の timeoutsize
と 60 秒の maximumdurationsize
でクリックストリーム データに対する SessionWindow
を作成することにより、ユーザー セッションの長さが測定されます。
SELECT DateAdd(second,-60,System.TimeStamp) AS WindowStart,
System.TimeStamp() AS WindowEnd,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY SessionWindow(second, 20, 60)
スナップショット
スナップショット ウィンドウを使用すると、同じタイムスタンプ値でイベントがグループ化されます。 他のウィンドウの種類とは異なり、特定のウィンドウ関数は必要ありません。 System.Timestamp()
関数をクエリの GROUP BY
句に指定することで、スナップショット ウィンドウを使用できます。
たとえば、次のクエリを使用すると、正確に同時に発生するイベントの最大読み取り値が検索されます。
SELECT System.TimeStamp() AS WindowTime,
MAX(Reading) AS MaxReading
INTO
[output]
FROM
[input] TIMESTAMP BY EventProcessedUtcTime
GROUP BY System.Timestamp()
System.Timestamp()
は、タイムスタンプが等しいかどうかに基づいてイベントがウィンドウにグループ化されるため、GROUP BY
句でのスナップショット ウィンドウ定義と見なされます。