Momentaufnahmefenster

Ein Momentaufnahmefenster definiert eine Teilmenge von Ereignissen, die in einem bestimmten Zeitraum stattfinden und für die Sie eine satzbasierte Berechnung, z. B. eine Aggregation, ausführen können. Momentaufnahmefenster teilen die Zeitachse an den Start- und Endzeiten von Ereignissen und sind daher dynamisch und ereignisgesteuert. Zusammen mit Zeitstempeländerungen sind sie äußerst flexibel und können für eine Vielzahl von Szenarien eingesetzt werden.

Eine allgemeine Beschreibung der Ereignisfenster sowie ihrer Implementierung und Verwendung in StreamInsight finden Sie unter Verwenden von Ereignisfenstern.

Grundlegendes zu Momentaufnahmefenstern

Momentaufnahmefenster werden nach den Start- und Endzeiten der Ereignisse im Datenstrom definiert und nicht anhand eines festen Rasters entlang der Zeitachse. Die Größe und der Zeitraum des Fensters werden nur von den Ereignissen im Datenstrom definiert. Für jedes Paar nächstgelegener Ereignisendpunkte (Startzeit und Endzeit) wird ein Momentaufnahmefenster erstellt. Gemäß dieser Definition fallen alle Start- und Endzeiten für Ereignisse nie zwischen, sondern immer auf Fenstergrenzen. Das heißt, Momentaufnahmefenster teilen die Zeitachse gemäß allen auftretenden Änderungen.

Die folgende Abbildung zeigt einen Datenstrom mit drei Ereignissen: e1, e2 und e3. Die senkrechten Striche veranschaulichen die von diesen Ereignissen definierten Grenzen von Momentaufnahmefenstern. Die hellblau angezeigten Ereignisströme stellen die Ereignisströme dar, die sich entlang der Zeitachse bewegen. Die orangefarbenen Felder zeigen die Momentaufnahmefenster und die in jedem Fenster enthaltenen Ereignisse. Auf Grundlage der Anfangs- und Endzeit befindet sich beispielsweise nur Ereignis e1 im ersten Momentaufnahmefenster. Sowohl Ereignis e1 als auch e2 sind jedoch überlappend und daher beide im zweiten Fenster enthalten.

Abbildung eines Momentaufnahmefensters

Nachdem das Framework die Eingaberichtlinie angewendet hat, wonach die Ereignisse auf die Fenster zugeschnitten werden (die einzige derzeit verfügbare Eingaberichtlinie), werden die Ereignisse entsprechend der folgenden Abbildung angezeigt.

Momentaufnahmefenster mit an das Fenster angepassten Ereignissen

Dies sind die Fenster und Ereignisse, die in den tatsächlichen satzbasierten Vorgang eingegeben werden. Sie müssen mit dem Clippingverhalten vertraut sein, wenn Sie ein benutzerdefiniertes zeitempfindliches Aggregat oder einen Operator anwenden, der die Zeitstempel von Eingabeereignissen überprüfen kann.

Definieren eines Momentaufnahmefensters

Momentaufnahmefenster verfügen über keine Parameter für die Fensterdefinition. Gemäß den Standardfensterrichtlinien werden Eingabe- und Ausgabeereignisse auf die Fenstergröße zugeschnitten.

var snapshotAgg = from w in inputStream.SnapshotWindow()
                  select new { sum = w.Sum(e => e.i) };

Im obigen Beispiel sind die Argumente für das Momentaufnahmefenster statische Eigenschaften, die Instanzen der entsprechenden Richtlinienklassen zurückgeben. Diese Eigenschaften werden der Einfachheit halber bereitgestellt.

Momentaufnahmefenster sind leistungsstarke Konstrukte, mit denen gleitende Fenster implementiert werden können. Ein gleitendes Fenster ist ein Fenster, das sich nicht in einem festen Zeitraum, sondern mit den Ereignissen bewegt. Der Vorteil eines gleitenden Fensters besteht darin, dass seine Länge an die Eingabeereignisse angepasst wird und es daher keine Ausgabe erzeugt, wenn sich die Eingabe nicht geändert hat. Dies kann eine Möglichkeit sein, den Ereignisdatenstrom zu komprimieren. Ein solcher Entwurf ist besonders für eine Aggregation innerhalb eines Group/Apply-Operators nützlich, wenn die Eingabedaten zu einer großen Zahl von Gruppen führen. Mit einem springenden Fenster würden die einzelnen Gruppen unabhängig vom Änderungsgrad der Eingabe ein Ergebnis für jedes Fenster erzeugen. Weitere Informationen finden Sie unter Springende Fenster.

Ein gleitendes Fenster wird mit dem Momentaufnahme-Operator zusammen mit der entsprechenden temporären Änderung des Eingabedatenstroms implementiert. Die Zeitstempeländerung (in der Regel eine Erweiterung der Ereignisdauer) ändert zunächst die "Abdeckung" der einzelnen Ereignisse im Zeitverlauf. Die Momentaufnahme enthält dann alle Ereignisse, die in diese Zeitdauer fallen. Beispiel: Sie möchten den gleitenden Durchschnitt eines Datenstroms zu einem Punktereignis im Laufe der letzten drei Minuten berechnen. Die folgende Abbildung zeigt, wie die auf den Eingabedatenstrom angewendete AlterEventDuration()-Methode jedes Ereignis entlang der Zeitachse "streckt".

Momentaufnahmefenster mit geändertem Zeitstempeln

Auf diesen Datenstrom wird der Momentaufnahme-Operator angewendet, und der Durchschnitt für das gewünschte Ereignisfeld wird übergreifend über die resultierenden Fenster berechnet (siehe die folgende Abbildung).

Momentaufnahmefenster mit aggregierten (Durchschnitts-) Ergebnissen

Die resultierenden Ereignisse in dieser Abbildung beschreiben zu jedem Zeitpunkt den Durchschnitt aller innerhalb der letzten drei Minuten stattgefundenen Ereignisse. Das Ergebnis wird durch Intervallereignisse dargestellt und dauert so lange, bis sich der Durchschnitt innerhalb des zeitlichen Rahmens ändert. Das vierte Ereignis in dieser Reihe bestätigt, dass der Durchschnitt aller während der letzten drei Minuten stattgefundenen Ereignisse, von jedem Punkt innerhalb dieses Ereignisses gemessen, 1,5 betrug. Das Ergebnisereignis startet, wenn das Punktereignis mit Nutzlast 3 gerade außerhalb des 3-Minutenfensters liegt, und endet unmittelbar bevor das Punktereignis mit Nutzlast 1 außerhalb des Fensters liegt (siehe folgende Abbildung).

Momentaufnahmefenster mit Punktereignisergebnissen

Mit LINQ (Language Integrated Query) wird dieses Szenario wie folgt ausgedrückt (es wird davon ausgegangen, dass der Typ des Eingabeereignisses über ein Feld "Wert" verfügt).

var result = from win in inputStream.AlterEventDuration(e => TimeSpan.FromMinutes(3)).SnapshotWindow()
             select new { average = win.Avg(e => e.Value) };

Um eine gewisse Zeit "zurückschauen" zu können, wenn Sie einen satzbasierten Vorgang mithilfe einer Momentaufnahme anwenden, müssen Sie die Ereignislebensdauern im Allgemeinen in die Zukunft erweitern. Um andere Ergebnisse zu erzielen, können Sie andere Arten von Operatoren zur Lebensdauerveränderung von Ereignissen verwenden. Weitere Informationen finden Sie unter Zeitstempeländerungen.

Siehe auch

Konzepte

Aggregationen

TopK

Benutzerdefinierte Aggregate und Operatoren

Zeitstempeländerungen

Anzahlfenster

Springende Fenster

Verwenden von Ereignisfenstern