Sdílet prostřednictvím


TIMESTAMP BY

✅ Azure Stream Analytics

Všechny události datového streamu mají přidružené časové razítko. Ve výchozím nastavení jsou události ze služby Event Hub a IoT Hub časové razítko na základě toho, kdy událost přijala služba Event Hub nebo IoT Hub; události ze služby Blob Storage jsou časové razítko času poslední změny objektu blob. Časové razítko události se nezmění, pokud úlohu znovu spustíte nebo znovu spustíte.

Mnoho streamovaných aplikací vyžaduje použití přesného časového razítka, které došlo k události, a nikoli času příjezdu. Například v aplikaci Point of Sales může vyžadovat časová razítka událostí odpovídající době, kdy byla platba zaznamenána, a ne čas, kdy událost platby dosáhne služby pro příjem událostí. Kromě toho můžou geograficky distribuované systémy a latence sítě přispět k nepředvídatelným časům příjezdu, což v aplikaci streamování umožňuje spolehlivější využití doby aplikace. V těchto případech klauzule TIMESTAMP BY umožňuje zadat vlastní hodnoty časového razítka. Hodnota může být libovolné pole z datové části události nebo výrazu typu DATETIME. Řetězcové hodnoty, které odpovídají některému z formátů ISO 8601 , jsou podporovány také.

Mějte na paměti, že použití vlastního časového razítka (klauzule TIMESTAMP BY) může způsobit, že Azure Stream Analytics ingestuje události mimo pořadí vzhledem k časovým razítkům ze dvou důvodů:

  • Jednotliví producenti událostí mohou mít různé (a nerovnoměrné) systémové hodiny.
  • Události jednotlivých výrobců událostí mohou být zpožděny při přenosu, například nedostupností sítě v lokalitě producenta.

Zatímco poruchy mezi producenty událostí mohou být velké, poruchy v rámci událostí od jednoho producenta jsou obecně malé nebo dokonce neexistující. V případě, že dotaz zpracovává pouze data od každého producenta událostí nezávisle, zpracování událostí od každého producenta na vlastní časové ose je efektivnější než správa časových nerovnoměrných rozsek mezi producenty. Azure Stream Analytics podporuje podstreamy zadáním klauzule OVER <nad dílčí klauzulí specifikace> , která umožňuje zpracování událostí na nezávislých časových osách. Pokud chcete zjistit, jaký vliv má použití klauzule OVER na zpracování úlohy, přečtěte si téma "Klauzule OVER komunikuje s řazením událostí".

Syntax

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

Remarks

Načítání časového razítka události

Časové razítko události lze načíst v příkazu SELECT v libovolné části dotazu pomocí vlastnosti System.Timestamp().

Klauzule OVER komunikuje s řazením událostí

Při použití klauzule OVER se upraví několik aspektů zpracování událostí službou Azure Stream Analytics:

  1. Maximální tolerance mimo pořadí se použije v rámci jedné řazené kolekce <členů nad specifikací>. To znamená, že událost je považována za mimo pořadí pouze v případě, že dorazí příliš mnoho mimo pořadí s ohledem na jiné události od stejného producenta událostí.

    Například hodnotu 0 lze použít, pokud jsou události od stejného producenta událostí vždy seřazené a výsledkem bude okamžité zpracování. Použití velkých hodnot zde naopak způsobí zpoždění zpracování při čekání na sestavení událostí mimo pořadí.

  2. Maximální tolerance pozdního příjezdu se použije globálně (jako by se hodnota OVER nepoužívala). To znamená, že událost se považuje za pozdní příchod, pokud je zvolené časové razítko (v klauzuli TIMESTAMP BY) příliš daleko od času příjezdu.

    Všimněte si, že použití velkých hodnot zde nezavedne zpoždění zpracování a události se budou zpracovávat okamžitě (nebo podle maximální tolerance mimo pořadí). Hodnota několika dní není nerozumná. Použití mimořádně dlouhých hodnot však může mít vliv na množství paměti potřebné ke zpracování úlohy.

  3. Výstupní události pro každého producenta událostí se generují při výpočtu, což znamená, že výstupní události mohou mít časové razítka mimo pořadí; budou však v pořadí v rámci jedné řazené kolekce <členů nad specifikací>.

Limitace a omezení

Klauzule TIMESTAMP BY OVER má následující omezení použití:

  1. Klauzule TIMESTAMP BY OVER musí být použita pro všechny vstupy dotazu nebo pro žádné z nich.

  2. Klauzule TIMESTAMP BY OVER je podporována pouze u plně paralelních úloh nebo úloh s jedním oddílem.

  3. Pokud vstupní datový proud obsahuje více než jeden oddíl, musí být klauzule OVER použita společně s klauzulí PARTITION BY. Sloupec PartitionId musí být zadán jako součást sloupců TIMESTAMP BY OVER.

  4. Pokud se použije klauzule TIMESTAMP BY OVER, musí být názvy sloupců z této klauzule použity jako seskupovací klíč v příkazech GROUP BY a ve všech predikátech JOIN při připojování mezi datovými proudy.

  5. Sloupce vytvořené v příkazu SELECT nebo v jiných klauzulích dotazu nelze použít v klauzuli TIMESTAMP BY, musí být použito pole ze vstupní datové části. Například výsledek funkce CROSS APPLY nelze použít jako cílovou hodnotu TIMESTAMP BY. Můžete ale použít jednu úlohu Azure Stream Analytics, která provádí CROSS APPLY, a použít druhou úlohu k provedení TIMESTAMP BY.

  6. System.Timestamp() nelze použít v TIMESTAMP BY, protože funkce TIMESTAMP BY určuje hodnotu System.Timestamp().

Examples

Příklad 1 – Přístup k poli časového razítka z datové části

Použití EntryTime pole z datové části jako časového razítka události

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

Příklad 2 – Použití času unixu z datové části jako časového razítka události

Systémy UNIX často používají čas POSIX (nebo Epoch) definovaný jako počet milisekund, které uplynuly od 00:00:00:00 Koordinovaný univerzální čas (UTC), čtvrtek 1. ledna 1970.

Tento příklad ukazuje, jak použít číselné pole epochtime obsahující epochový čas jako časové razítko události.

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

Příklad 3 – heterogenní časová razítka

Představte si zpracování heterogenních datových proudů obsahujících dva typy událostí A a B. Události A obsahují data časového razítka v poli TimestampA a události B mají v poli timestampB časové razítko.

Tento příklad ukazuje, jak zapsat TIMESTAMP BY, aby bylo možné pracovat s oběma typy událostí a časových razítek.

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

Příklad 4 – Zpracování více časových os v děleném dotazu

Zpracovávat data od různých odesílatelů (placené stanice) bez použití časových zásad pro různá ID placené stanice Vstupní data jsou rozdělena na základě placeného čísla.

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()
Zásady nerovnoměrné distribuce času
Vysvětlení zpracování času ve službě Azure Stream Analytics
Unix Time