TIMESTAMP BY (Azure Stream Analytics)

Alla dataströmhändelser har en associerad tidsstämpel. Som standard tidsstämplas händelser från Event Hub och IoT Hub baserat på när händelsen togs emot av händelsehubben eller IoT Hub. Händelser från Blob Storage tidsstämplas av blobens senaste ändrade tid. Tidsstämpeln för en händelse ändras inte om du startar om eller kör jobbet igen.

Många strömmande program kräver att du använder den exakta tidsstämpeln som en händelse har inträffat i stället för ankomsttiden. I ett point of sales-program kan man till exempel behöva tidsstämplar för händelser som motsvarar den tid då en betalning loggades, i stället för när en betalningshändelse når händelseinmatningstjänsten. Dessutom kan geo-distribuerade system och nätverksfördröjningar bidra till oförutsägbara ankomsttider, vilket gör användningen av en programtid mer tillförlitlig i ett strömmande program. I dessa fall tillåter TIMESTAMP BY-satsen att ange anpassade tidsstämpelvärden. Värdet kan vara valfritt fält från händelsenyttolasten eller uttrycket av typen DATETIME. Strängvärden som överensstämmer med något av ISO 8601-format stöds också.

Observera att användning av en anpassad tidsstämpel (TIMESTAMP BY-sats) kan orsaka att Azure Stream Analytics matar in händelser i fel ordning med avseende på deras tidsstämplar av två skäl:

  • Enskilda händelseproducenter kan ha olika (och skeva) systemklockor.
  • Händelser från enskilda händelseproducenter kan fördröjas under överföringen, till exempel på grund av att nätverket inte är tillgängligt på producentens plats.

Även om störningen mellan händelseproducenter kan vara stor, är störningen inom händelserna från en enda producent i allmänhet liten eller till och med obefintlig. Om en fråga bara bearbetar data från varje händelseproducent oberoende av varandra är det effektivare att hantera händelser från varje producent i sin egen tidslinje än att hantera tidsförskjutningar mellan producenter. Azure Stream Analytics stöder underströmmar genom att ange OVER over <spec-undersatsen> för att möjliggöra bearbetning av händelser i oberoende tidslinjer. Se "OVER-satsen interagerar med händelseordning" för hur användningen av OVER-satsen påverkar bearbetningen av jobbet.

Syntax

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

Kommentarer

Hämta tidsstämpel för händelser

Händelsetidsstämpel kan hämtas i SELECT-instruktionen i valfri del av frågan med hjälp av egenskapen System.Timestamp().

OVER-satsen interagerar med händelseordning

När OVER-satsen används ändras flera aspekter av händelsebearbetning av Azure Stream Analytics:

  1. Maximal out-of-order-tolerans tillämpas inom en enda värdetuppel av <över specifikation.> En händelse anses alltså vara oordnad endast om den är för oordnad i förhållande till andra händelser från samma händelseproducent.

    Till exempel kan värdet "0" användas om händelser från samma händelseproducent alltid sorteras och resulterar i omedelbar bearbetning. Å andra sidan medför användning av stora värden här bearbetningsfördröjningar i väntan på att out-of-order-händelserna ska monteras.

  2. Maximal tolerans för sen ankomst tillämpas globalt (som om OVER inte användes). En händelse anses alltså komma sent om den valda tidsstämpeln (i TIMESTAMP BY-satsen) är för långt tillbaka från ankomsttiden.

    Observera att användning av stora värden här inte medför bearbetningsfördröjningar och att händelser fortfarande bearbetas omedelbart (eller enligt den maximala out-of-order-toleransen). Ett värde på flera dagar är inte orimligt. Användning av exceptionellt långa värden kan dock påverka mängden minne som krävs för att bearbeta jobbet.

  3. Utdatahändelser för varje händelseproducent genereras när de beräknas, vilket innebär att utdatahändelserna kan ha tidsstämplar som inte är i ordning. De kommer dock att vara i ordning inom en enda värdetuppel av <över spec>.

Begränsningar och begränsningar

TIMESTAMP BY OVER-satsen har följande användningsbegränsningar:

  1. TIMESTAMP BY OVER-satsen måste användas för alla indata i frågan eller inte användas för någon av dem.

  2. TIMESTAMP BY OVER-satsen stöds endast med helt parallella jobb eller enkla partitionsjobb.

  3. Om indataströmmen har mer än en partition måste OVER-satsen användas tillsammans med PARTITION BY-satsen. Kolumnen PartitionId måste anges som en del av TIMESTAMP BY OVER-kolumner.

  4. Om TIMESTAMP BY OVER-satsen används måste kolumnnamn från -satsen användas som grupperingsnyckel i GROUP BY-instruktioner och i alla JOIN-predikat vid koppling mellan strömmar.

  5. Kolumner som skapats i en SELECT-instruktion eller i andra frågesatser kan inte användas i TIMESTAMP BY-satsen. Ett fält från indatanyttolasten måste användas. Resultatet av en CROSS APPLY kan till exempel inte användas som målvärde för TIMESTAMP BY. Du kan dock använda ett Azure Stream Analytics-jobb som utför CROSS APPLY och använda ett andra jobb för att utföra TIMESTAMP BY.

  6. System.Timestamp() kan inte användas i TIMESTAMP BY, eftersom TIMESTAMP BY är det som etablerar värdet för System.Timestamp().

Exempel

Exempel 1 – Få åtkomst till ett tidsstämpelfält från nyttolasten

Använda EntryTime fältet från nyttolasten som händelsetidsstämpel

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

Exempel 2 – Använd UNIX-tid från nyttolasten som händelsetidsstämpel

UNIX-system använder ofta POSIX-tid (eller epok) som definierats som antalet millisekunder som har förflutit sedan 00:00:00 Coordinated Universal Time (UTC), torsdagen den 1 januari 1970.

Det här exemplet visar hur du använder numeriska "epochtime"-fält som innehåller epoktid som tidsstämpel för händelser.

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

Exempel 3 – Heterogena tidsstämplar

Tänk dig att du bearbetar heterogena dataströmmar som innehåller två typer av händelser "A" och "B". Händelser "A" har tidsstämpeldata i fältet "tidsstämpel" och händelser "B" har tidsstämpel i fältet "tidsstämpelB".

Det här exemplet visar hur du skriver TIMESTAMP BY för att kunna arbeta med båda typerna av händelser/tidsstämplar.

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

Exempel 4 – Hantera flera tidslinjer i en partitionerad fråga

Bearbeta data från olika avsändare (avgiftsbelagda stationer) utan att tillämpa tidsprinciper för olika avgiftsbelagda stations-ID:t. Indata partitioneras baserat på TollId.

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

Se även

System.Timestamp()
Principer för tidsförskjutning
Förstå tidshantering i Azure Stream Analytics
Unix-tid