Share via


ホッピング ウィンドウ

ホッピング ウィンドウは、一定期間内に発生した、集計などのセットベースの計算の対象にできるイベントのサブセットを定義します。ホッピング ウィンドウでは、カウント ウィンドウやスナップショット ウィンドウとは異なり、タイムラインがイベントの開始時刻や終了時刻とは関係なく一定の間隔で分割されます。StreamInsight では、ホッピング ウィンドウを重ねたり、連続したウィンドウの間にすきまを残したりできます。 

イベント ウィンドウとその StreamInsight での実装および使用に関する一般的な説明については、「イベント ウィンドウの使用」を参照してください。

ホッピング ウィンドウについて

ホッピング ウィンドウとは、一定の期間ごとに前方に "ホップ" するウィンドウです。このウィンドウは、ホップ サイズ H とウィンドウ サイズ S という 2 つの期間によって定義されます。各 H の時間単位には、サイズ S の新しいウィンドウが作成されます。

次の図は、一連のポイント イベントを含むストリームを示しています。縦棒は、タイムラインを区切るホッピング ウィンドウを示しています。ここでは、H は S と等しくなっています。これは、すきまがなく重複しないホッピング ウィンドウを表し、タンブリング ウィンドウとも呼ばれています。便宜を図るために、この種のウィンドウのために別個の拡張メソッドが用意されています。オレンジ色のボックスはそれぞれ、ウィンドウ ストリームとそのウィンドウに関連したイベントを表しています。

タンブリング ウィンドウ

ウィンドウごとにセットベースの操作が行われ、ウィンドウで指定された出力ポリシーに基づくタイムスタンプ付きの結果が生成されます。出力ポリシー PointAlignToWindowEnd の場合、結果は次のようになります。

PointAlignToWindowEnd のタンブリング ウィンドウ

イベントは、ウィンドウの境界を超えている場合、複数のウィンドウに含まれます。次の図に、e1、e2、および e3 という 3 つの期間イベントを含むストリームを示します。ホップ サイズ H がウィンドウ サイズ S よりも小さい場合、ウィンドウは重複し、重複期間内のイベントが複数のウィンドウにまたがることのないポイント イベントであっても、複数のウィンドウに分類されます。

ホッピング ウィンドウの図

この図はウィンドウ内のイベントがウィンドウの入力ポリシーによってクリップされた状態を示していることに注意してください。入力ポリシーは、すべての StreamInsight ウィンドウの場合と同様に、ウィンドウ サイズに合わせてイベントをクリップします。時間が重要となる集計または演算子では、イベントの元の有効期限ではなく、ウィンドウ内のクリップされたイベントの有効期限が使用されます。つまり、対象はウィンドウ内に限られます。

必要に応じて、配置パラメーターを指定できます。たとえば、24 時間のタンブリング ウィンドウの既定の配置では、各ウィンドウの開始時刻と終了時刻は午前 0 時になっています。カスタム配置を指定すると (たとえば、午前 9 時から午前 9 時までの 24 時間のウィンドウ)、タイムライン上の絶対点に従ってウィンドウが配置されます (この例では、時刻部分が 9:00 A.M. である datetime 値)。配置パラメーターは、DateTimeKind.Utc の種類の DateTime オブジェクトとして指定される必要があります。

ホッピング ウィンドウを使用すると、適用されたセットベースの演算は入力が前のウィンドウに関して変更されたかどうかにかかわらず結果を生成することに注意してください。これは、ホッピング ウィンドウによってタイムラインが一定の間隔で分割されるためです。次の図に示すホッピング ウィンドウのアプリケーションは、ウィンドウのホップ サイズより大幅に長くなっています。これは、"10 秒ごとに 5 分以内に発生したすべてのイベントの平均を計算する" などのシナリオでは一般的です。

重なっているイベントがあるホッピング ウィンドウ。

次の図は、出力ポリシーが PointAlignToWindowEnd であるときに、このような集計をウィンドウ ストリームに対して実行した結果を示しています。

PointAlignToWindowEnd の集計

Sum、Avg、Count など、時間が重要ではない集計では、この図内のすべての集計結果が同じ値になります。これは、基になるウィンドウに影響するのは常に同じペイロード e1 および e2 であるためです。この反復的結果の動作を特に考慮する必要があるのは、このようなウィンドウをグループ数の多いグループ化と適用操作内で適用する場合です。ウィンドウの頻度が元のイベント頻度より高い場合 (前の図に示す例の場合など)、出力イベント レートが重要になります。入力が変更されたときのみに集計結果が生成される必要がある場合は、代わりにスナップショット ウィンドウを使用します。

出力ポリシー

PointAlignToWindowEnd

出力ポリシーでは、前の図に示したようにウィンドウの開始時刻と終了時刻が同じであるポイント イベントが返されます。その時点での最新の集計結果を表す有効な結果はどの時点でも 1 つだけであるため、この新しい出力ポリシーは結果を別のストリームと結合する場合に便利です。この出力ポリシーが指定されているホッピング ウィンドウをポイントからシグナルへのデザイン パターンと組み合わせて、集計結果の連続ストリームを作成できます。集計結果には、各時点における最新の既知の結果を持つ期間イベントが含まれます。

PointAlignToWindowEnd は、ホッピング ウィンドウの出力ポリシーが指定されていない場合の既定の出力ポリシーです。

ClipToWindowEnd

この出力ポリシーでは、次の図に示したように、セットベースの操作の有効期間に対応するウィンドウ サイズが返されます。このことは、クエリの活動状態に対して意味を持ちます。

ホッピング ウィンドウの ClipToWindowEnd 出力ポリシーホッピング ウィンドウの新しい出力ポリシー

CTI の動作

ホッピング ウィンドウは CTI (Current Time Increment) イベントに影響することがあることに注意してください。出力ポリシーが ClipToWindowEnd である場合、各 CTI イベントが対応する各ウィンドウの先頭に移動されます。この理由は、ウィンドウ サイズはウィンドウに対する操作の結果に割り当てられるためです。したがって、ウィンドウ内のイベントが受信される場合、ウィンドウの時間帯全体が変更されることがあります。ただし、出力ポリシーが NEW_POLICY である場合は、CTI イベントは変更なしで渡されます。CTI イベントの詳細については、「先行するアプリケーション時間」を参照してください。

ホッピング ウィンドウの定義

次の例に示すように、ホッピング ウィンドウは、そのウィンドウ サイズとホップ サイズで定義されます。

var hoppingAgg = from w in inputStream.HoppingWindow(TimeSpan.FromHours(1),
                                                     TimeSpan.FromMinutes(10))
                 select new { sum = w.Sum(e => e.i) };

上記の例のホッピング ウィンドウのポリシー引数は、対応するポリシー クラスのインスタンスを返す静的プロパティです。

ホップ サイズとウィンドウ サイズが同じ場合は、次の例に示すように、タンブリング ウィンドウという簡略化されたバージョンを使用できます。

var tumblingAgg = from w in inputStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { sum = w.Sum(e => e.i) };

ホッピング (またはタンブリング) ウィンドウの配置は、オプションのパラメーターです。次の例では、各ウィンドウの開始時刻と終了時刻が午前 9 時になります (協定世界時 (UTC))。

var alignment = new DateTime(TimeSpan.FromHours(9).Ticks, DateTimeKind.Utc);
var snapshotAgg = from w in inputStream.TumblingWindow(
                         TimeSpan.FromHours(24),
                         alignment,
                         HoppingWindowOutputPolicy.ClipToWindowEnd)
                  select new { sum = w.Sum(e => e.i) };

関連項目

概念

集計

TopK

ユーザー定義の集計と演算子

カウント ウィンドウ

スナップショット ウィンドウ

イベント ウィンドウの使用