TopK

In den Beispielen zu diesem Thema wird veranschaulicht, wie mit dem TopK-Vorgang Ereignisse in einem Fensterdatenstrom geordnet werden und die obersten N Ereignisse in aufsteigender oder absteigender Rangreihenfolge zurückgegeben werden. TopK wird durch die Take()-Erweiterungsmethode angegeben, die einen Datenstrom des Typs CepOrderedStream<T> erwartet. Dieser Typ wird erzeugt, sobald eine orderby-Klausel angegeben wird. Die orderby-Klausel muss für Ereignisse innerhalb eines CepWindowStream<T>-Datenstroms ausgeführt werden. Daher muss ein Operator für eine Momentaufnahme oder ein springendes (rollierendes) Fenster auf den Eingabedatenstrom angewendet werden.

Bei gleichwertigen Elementen gibt TopK mehr als N Ereignisse zurück und verhält sich damit immer deterministisch.

TopK funktioniert nicht mit anzahlbasierten Fenstern.

TopK wird als zeitunempfindlicher Operator implementiert. Daher werden die Lebensdauern der Ausgabeereignisse entsprechend der Ausgaberichtlinie des Fensters festgelegt.

Beispiele

Im folgenden Beispiel werden die obersten fünf Ereignisse aus jedem für den Eingabedatenstrom inputStream definierten Momentaufnahmefenster verwendet und ein neuer Ereignisdatenstrom generiert. Die Ereignisse in jedem Fenster werden in aufsteigender Reihenfolge der Werte in den Nutzlastfeldern e.f sortiert, kombiniert mit der absteigenden Reihenfolge der Werte im Nutzlastfeld 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);

Sie können eine Projektion in einer Take-Klausel verwenden, wie im folgenden Beispiel gezeigt.

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
                                         });

Wenn das tatsächliche Rangfolgeergebnis in die Nutzlast der Ereignisse projiziert werden muss, wird ein entsprechender Lambda-Ausdruck verwendet. Der Zugriff auf den Rang erfolgt dann über die Eigenschaft Rank, während auf die Nutzlastfelder über die Eigenschaft Payload zugegriffen werden kann.

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
               });

Die folgende Abbildung zeigt die temporäre Eigenschaft eines TopK-Ergebnisses. In diesem Beispiel wird ein springendes Fenster mit TopK verwendet, sodass die zwei Ereignisse mit den höchsten Nutzlastwerten für das Nutzlastfeld val in jedem Fenster ausgewählt werden.

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);

Die orangefarbenen Felder stellen die Fenster dar. Die Abbildung zeigt, wie TopK die Lebensdauern der ausgewählten Nutzlasten auf die Fenstergröße festlegt. Hier nehmen wir Punktereignisse im Eingabedatenstrom an, sodass der Wert ihres Nutzlastfelds val angezeigt wird. Beachten Sie, dass die angegebene Ausgaberichtlinie von ClipToWindowEnd die Fensterzeitspanne den Ergebnisereignissen zuweist.

Zeigt die temporäre Eigenschaft eines TopK-Ergebnisses an

Es ist wichtig, das Verhalten von TopK bei gleichwertigen Elementen zu verstehen. Im folgenden Beispiel enthält der Eingabedatenstrom doppelte Werte, und es werden die obersten beiden Werte für ein rollierendes Fenster berechnet. In diesem Beispiel wird die Standardausgaberichtlinie PointAlignToWindowEnd verwendet:

TopK-Operator mit PointAlignToWindowEnd-Richtlinie

Die obersten beiden Werte im ersten Fenster sind 3 und 2. Alle Ereignisse, bei denen das geordnete Feld einen dieser Werte aufweist, werden in das Ergebnis aufgenommen, das in diesem Beispiel drei Ereignisse enthält.

Siehe auch

Konzepte

StreamInsight-Serverkonzepte

Verwenden von Ereignisfenstern

Springende Fenster

Momentaufnahmefenster