Dela via


TIMESTAMP BY

✅ Azure Stream Analytics

Alla dataströmshändelser har en tidsstämpel associerad med dem. 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 ändringstid. 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 inträffade i stället för ankomsttiden. I ett point of sales-program kan man till exempel behöva händelsetidsstämplar som motsvarar den tid då en betalning loggades, i stället för den tid då 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-satsen) kan leda till 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 sjukdomen inom händelserna från en enda producent i allmänhet liten eller till och med obefintlig. Om en fråga endast bearbetar data från varje händelseproducent oberoende av varandra är det effektivare att hantera händelser från varje producent på 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 ]  

Remarks

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

Händelsetidsstämpeln 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 specifikationen>. En händelse anses alltså inte vara i ordning förrän den är för oordnad när det gäller 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 sammanställas.

  2. Maximal tolerans för sena ankomster 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 kommer att bearbetas omedelbart (eller enligt den maximala toleransen för out-of-order). Ett värde på flera dagar är inte orimligt. Att använda 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 specifikationen>.

Begränsningar och restriktioner

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-predikater 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 fastställer värdet för System.Timestamp().

Examples

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), torsdag den 1 januari 1970.

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

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 bearbeta 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 på olika avgiftsbelagda stations-ID:er. 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

See Also

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