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:
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.
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.
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:
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.
TIMESTAMP BY OVER-satsen stöds endast med helt parallella jobb eller enkla partitionsjobb.
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.
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.
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.
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