TIMESTAMP BY (Azure Stream Analytics)

Allen Datenstromereignissen ist ein Zeitstempel zugeordnet. Standardmäßig werden Ereignisse aus Event Hub und IoT Hub basierend darauf zeitstempelt, wann das Ereignis vom Event Hub oder IoT Hub empfangen wurde. Ereignisse aus Blob storage werden nach der Letzten Änderungszeit des Blobs zeitstempelt. Der Zeitstempel eines Ereignisses ändert sich nicht, wenn Sie Ihren Auftrag erneut starten oder erneut ausführen.

Viele Streaminganwendungen erfordern die Verwendung des genauen Zeitstempels, den ein Ereignis aufgetreten ist, und nicht die Ankunftszeit. Beispielsweise benötigt man in einer Point of Sales-Anwendung möglicherweise Ereigniszeitstempel, die dem Zeitpunkt entsprechen, zu dem eine Zahlung protokolliert wurde, anstatt den Zeitpunkt, zu dem ein Zahlungsereignis den Ereigniserfassungsdienst erreicht hat. Darüber hinaus können geoverteilte Systeme und Netzwerklatenz zu unvorhersehbaren Ankunftszeiten beitragen, wodurch die Nutzung der Anwendungszeit in einer Streaminganwendung zuverlässiger wird. In diesen Fällen ermöglicht die TIMESTAMP BY-Klausel das Angeben benutzerdefinierter Zeitstempelwerte. Der Wert kann ein beliebiges Feld aus der Ereignisnutzlast oder ein Ausdruck vom Typ DATETIME sein. Zeichenfolgenwerte, die einem beliebigen ISO 8601-Format entsprechen, werden ebenfalls unterstützt.

Beachten Sie, dass die Verwendung eines benutzerdefinierten Zeitstempels (TIMESTAMP BY-Klausel) dazu führen kann, dass Azure Stream Analytics Ereignisse aus zwei Gründen in ungeordneter Reihenfolge in Bezug auf ihre Zeitstempel erfasst:

  • Einzelne Ereignisproduzenten können unterschiedliche (und verzerrte) Systemuhren aufweisen.
  • Ereignisse von einzelnen Ereignisproduzenten können bei der Übertragung verzögert werden, z. B. durch die Nichtverfügbarkeit des Netzwerks am Standort des Herstellers.

Während die Störung zwischen den Ereignisproduzenten groß sein kann, ist die Störung innerhalb der Ereignisse eines einzelnen Herstellers in der Regel klein oder gar nicht vorhanden. Wenn eine Abfrage nur Daten von jedem Ereignisproduzenten unabhängig verarbeitet, ist die Behandlung von Ereignissen von jedem Produzenten in seinem eigenen Zeitleiste effizienter als das Verwalten von Zeitverschiebungen zwischen Denkproduzenten. Azure Stream Analytics unterstützt Substreams, indem over <over over spec-Subklausel> angegeben wird, um die Verarbeitung von Ereignissen in unabhängigen Zeitachsen zu ermöglichen. Informationen zu den Auswirkungen, die die Verwendung der OVER-Klausel auf die Verarbeitung des Auftrags hat, finden Sie unter "OVER-Klausel interagiert mit Ereignisreihenfolge".

Syntax

TIMESTAMP BY scalar_expression [OVER <over spec> ]  
      
<over spec> ::= 
      { column_name | expression } [,...n ]  

Hinweise

Abrufen des Ereigniszeitstempels

Ereigniszeitstempel kann in der SELECT-Anweisung in jedem Teil der Abfrage mithilfe der System.Timestamp()-Eigenschaft abgerufen werden.

OVER-Klausel interagiert mit der Ereignisreihenfolge

Wenn die OVER-Klausel verwendet wird, werden mehrere Aspekte der Ereignisverarbeitung durch Azure Stream Analytics geändert:

  1. Die maximale Out-of-Order-Toleranz wird innerhalb eines einzelnen Werttupels von über Spezifikation <>angewendet. Das heißt, ein Ereignis wird nur dann als ungeordnet betrachtet, wenn es im Hinblick auf andere Ereignisse vom gleichen Ereignisproduzenten zu ungeordnet eingeht.

    Für instance kann der Wert "0" verwendet werden, wenn Ereignisse vom gleichen Ereignisproduzenten immer sortiert werden und zu einer sofortigen Verarbeitung führen. Auf der anderen Seite führt die Verwendung großer Werte hier zu Verarbeitungsverzögerungen, während sie darauf warten, dass sich die ereignisse außerhalb der Reihenfolge zusammensetzen.

  2. Die maximale Toleranz für späte Ankunft wird global angewendet (als ob OVER nicht verwendet wurde). Das heißt, ein Ereignis wird als zu spät eintreffend betrachtet, wenn der ausgewählte Zeitstempel (in der TIMESTAMP BY-Klausel) zu weit von seiner Ankunftszeit zurück liegt.

    Beachten Sie, dass die Verwendung großer Werte hier keine Verarbeitungsverzögerungen mit sich bringt und Ereignisse weiterhin sofort (oder entsprechend der maximalen Fehlertoleranz) verarbeitet werden. Ein Wert von mehreren Tagen ist nicht unangemessen. Die Verwendung außergewöhnlich langer Werte kann sich jedoch auf die Menge des für die Verarbeitung des Auftrags erforderlichen Arbeitsspeichers auswirken.

  3. Ausgabeereignisse für jeden Ereignisproduzenten werden während der Berechnung generiert, was bedeutet, dass die Ausgabeereignisse möglicherweise Zeitstempel in out-of-Order aufweisen. sie werden jedoch innerhalb eines Einzelnen-Werttupels von <über Spezifikation> in Ordnung sein.

Einschränkungen

DIE TIMESTAMP BY OVER-Klausel weist die folgenden Nutzungseinschränkungen auf:

  1. DIE TIMESTAMP BY OVER-Klausel muss für alle Eingaben der Abfrage verwendet werden oder nicht für eine dieser Eingaben verwendet werden.

  2. DIE TIMESTAMP BY OVER-Klausel wird nur bei vollständig parallelen Aufträgen oder Einzelpartitionsaufträgen unterstützt.

  3. Wenn der Eingabestream über mehrere Partitionen verfügt, muss die OVER-Klausel zusammen mit der PARTITION BY-Klausel verwendet werden. Die PartitionId-Spalte muss als Teil der TIMESTAMP BY OVER-Spalten angegeben werden.

  4. Wenn die TIMESTAMP BY OVER-Klausel verwendet wird, müssen Spaltennamen aus der -Klausel als Gruppierungsschlüssel in GROUP BY-Anweisungen und in allen JOIN-Prädikaten beim Verknüpfen zwischen Streams verwendet werden.

  5. Spalten, die in einer SELECT-Anweisung oder in anderen Abfrageklauseln erstellt wurden, können nicht in der TIMESTAMP BY-Klausel verwendet werden. Ein Feld aus der Eingabenutzlast muss verwendet werden. Beispielsweise kann das Ergebnis einer CROSS APPLY-Instanz nicht als Zielwert von TIMESTAMP BY verwendet werden. Sie können jedoch einen Azure Stream Analytics-Auftrag verwenden, der CROSS APPLY ausführt, und einen zweiten Auftrag verwenden, um TIMESTAMP BY auszuführen.

  6. System.Timestamp() kann nicht in TIMESTAMP BY verwendet werden, da TIMESTAMP BY den Wert von System.Timestamp() festlegt.

Beispiele

Beispiel 1: Zugreifen auf ein Zeitstempelfeld aus der Nutzlast

Verwenden eines EntryTime Felds aus der Nutzlast als Ereigniszeitstempel

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

Beispiel 2: Verwenden von UNIX-Zeit aus der Nutzlast als Ereigniszeitstempel

UNIX-Systeme verwenden häufig POSIX-Zeit (oder Epoche), die als Anzahl von Millisekunden definiert ist, die seit 00:00:00:00 Koordinierte Weltzeit (UTC) am Donnerstag, den 1. Januar 1970 verstrichen sind.

In diesem Beispiel wird gezeigt, wie Sie ein numerisches "epochtime"-Feld verwenden, das epochenzeit als Ereigniszeitstempel enthält.

SELECT  
      System.Timestamp(),  
      LicensePlate,  
      State  
FROM input TIMESTAMP BY DATEADD(millisecond, epochtime, '1970-01-01T00:00:00Z')  

Beispiel 3: Heterogene Zeitstempel

Stellen Sie sich vor, sie verarbeiten heterogene Datenströme, die zwei Ereignistypen "A" und "B" enthalten. Ereignisse "A" verfügen über Zeitstempeldaten im Feld "timestampA" und Ereignisse "B" über Zeitstempel im Feld "timestampB".

In diesem Beispiel wird gezeigt, wie TIMESTAMP BY geschrieben wird, um mit beiden Arten von Ereignissen/Zeitstempeln arbeiten zu können.

SELECT  
      System.Timestamp(),  
      eventType,  
      eventValue,  
FROM input TIMESTAMP BY  
      (CASE eventType   
            WHEN 'A' THEN timestampA  
            WHEN 'B' THEN timestampB  
      ELSE NULL END) 

Beispiel 4: Behandeln mehrerer Zeitachsen in einer partitionierten Abfrage

Verarbeiten von Daten von unterschiedlichen Absendern (Mautstationen), ohne Zeitrichtlinien für verschiedene Mautstellen-IDs anzuwenden. Die Eingabedaten werden basierend auf TollId partitioniert.

SELECT
      TollId,
      COUNT(*) AS Count
FROM input
      TIMESTAMP BY EntryTime OVER TollId, PartitionId
      PARTITION BY PartitionId
GROUP BY TUMBLINGWINDOW(minute,3), TollId, PartitionId

Weitere Informationen

System.Timestamp()
Richtlinien zur Zeitabweichung
Grundlegendes zur Behandlung von Zeitangaben in Azure Stream Analytics
Unix-Zeit