次の方法で共有


TopK

このトピックの例では、TopK 演算子を使用して、ウィンドウ ストリーム内のイベントにランクを付け、昇順または降順に上位 N 個のイベントを返す方法を示します。TopK は、Take() 拡張メソッドで指定します。このメソッドには、CepOrderedStream<T> 型のストリームが必要です。この型は、orderby 句が指定されると直ちに生成されます。orderby 句は CepWindowStream<T> ストリーム内のイベントを操作する必要があります。したがって、スナップショットまたはホッピング (タンブリング) ウィンドウの演算子は入力ストリームに適用する必要があります。

ties (同順位) の場合、TopK は N より多くのイベントを返すため、常に確定的に動作します。

TopK はカウントベースのウィンドウには使用できません。

TopK は、時間を区別しない演算子として実装されます。したがって、出力イベントの有効期間はウィンドウの出力ポリシーに従って設定されます。

使用例

次の例では、入力ストリーム inputStream 用に定義された各スナップショット ウィンドウから上位 5 つのイベントを取得し、新しいイベント ストリームを生成します。各ウィンドウのイベントは、ペイロード フィールド e.f の値の昇順と、ペイロード フィールド e.i の値の降順を組み合わせて並べられます。

// Assuming the following input event type for inputStream: 
public class MyPayload 
{
  public int f; 
  public int i; 
}

var topfive = (from window in inputStream.Snapshot()
               from e in window
               orderby e.f ascending, e.i descending
               select e).Take(5);

次の例のように、Take 句の投影をすることもできます。

var result = (from win in source
                       .TumblingWindow(TimeSpan.FromMinutes(10), HoppingWindowOutputPolicy.ClipToWindowEnd)
                   from r in win
                   orderby r.Value descending
                   select new { scaled = r.Value / 10, r.SourceId }).Take(2, e => new
                                         {
                                             ranking = e.Rank,
                                             e.Payload. scaled,
                                             e.Payload.SourceId
                                         });

実際の順位付け結果をイベントのペイロードに反映する必要がある場合は、対応するラムダ式が使用されます。以降、ランクには Rank プロパティを使用してアクセスしますが、ペイロード フィールドには、Payload プロパティを使用してアクセスします。

var topthree = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(2), WindowOutputPolicy.ClipToWindowEnd)
               from e in window
               orderby e.f ascending, e.i descending
               select e).Take(3, e => new
               {
                   ranking = e.Rank,
                   f = e.Payload.f,
                   i = e.Payload.i
               });

次の図は、TopK の結果の一時的なプロパティを示しています。この例では、TopK でホッピング ウィンドウを使用し、ペイロード フィールド val のペイロード値が最も大きい 2 つのイベントが各ウィンドウから選ばれます。

var two = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(10), WindowOutputPolicy.ClipToWindowEnd)
               from e in window
               orderby e.val descending
               select e).Take(2);

オレンジ色のボックスはウィンドウを表します。この図は、選択したペイロードの有効期間がウィンドウ サイズに設定される方法を示しています。ここでは、入力ストリームのポイント イベントを想定し、ペイロード フィールド val の値を表示しています。ClipToWindowEnd の指定された出力ポリシーによって、結果イベントにウィンドウの期間が割り当てられることに注意してください。

TopK の結果の一時的なプロパティを示します。

ties については、TopK の動作を理解しておくことが重要です。入力ストリームに重複値が含まれ、タンブリング ウィンドウを超える上位 2 つの値が計算される次のような例を想定します。この例では、PointAlignToWindowEnd のデフォルトの出力ポリシーが使用されます。

PointAlignToWindowEnd ポリシーの TopK 演算子

最初のウィンドウの上位 2 つの値は 3 と 2 です。ランク フィールドにこれらの値のいずれかが含まれるすべてのイベントは結果に含まれます。次の例では、3 つのイベントが含まれます。

関連項目

概念

StreamInsight サーバーの概念

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

ホッピング ウィンドウ

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