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 z centra událostí a IoT Hub časové razítko na základě toho, kdy byla událost přijata centrem událostí nebo IoT Hub. Události z úložiště objektů blob jsou časové razítko časem poslední změny objektu blob. Časové razítko události se nezmění, pokud úlohu znovu spustíte nebo znovu spustíte.

Mnoho streamovacích aplikací vyžaduje použití přesného časového razítka události, nikoli času přijetí. Například v aplikaci point of sales může být potřeba časová razítka událostí odpovídající času, kdy byla platba zaznamenána, a ne čas, kdy platební událost dosáhne služby příjmu událostí. Kromě toho geograficky distribuované systémy a latence sítě můžou přispět k nepředvídatelným časům doručení, aby bylo využití času aplikace ve streamované aplikaci spolehlivější. V těchto případech klauzule TIMESTAMP BY umožňuje zadat vlastní hodnoty časových razítek. Hodnotou může být libovolné pole datové části události nebo výraz typu DATETIME. Podporují se také řetězcové hodnoty odpovídající libovolnému formátu ISO 8601 .

Všimněte si, ž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í s ohledem na jejich časová razítka, a to ze dvou důvodů:

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

Zatímco porucha mezi producenty událostí může být velká, porucha v událostech od jednoho producenta je obecně malá nebo dokonce neexistuje. V případě, že dotaz zpracovává data od jednotlivých producentů událostí nezávisle, zpracování událostí od každého producenta v jeho vlastní časové ose je efektivnější než správa časových nerovnoměrných rozdílů mezi producenty. Azure Stream Analytics podporuje podstreamy zadáním pod klauzule OVER <over spec> , která umožňuje zpracování událostí v nezávislých časových osách. Informace o dopadu použití klauzule OVER na zpracování úlohy najdete v tématu Klauzule OVER interaguje s řazením událostí.

Syntax

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

Poznámky

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

Časové razítko události je možné 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 změní několik aspektů zpracování událostí službou Azure Stream Analytics:

  1. Maximální tolerance mimo pořadí se používá v rámci řazené <kolekce hodnot over spec>. To znamená, že událost je považována za událost mimo pořadí pouze v případě, že přijde příliš mimo pořadí s ohledem na jiné události od stejného producenta události.

    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í. Na druhou stranu použití velkých hodnot způsobí zpoždění zpracování při čekání na sestavení událostí mimo pořadí.

  2. Maximální tolerance pozdních příletů se uplatňuje globálně (jako kdyby nebyla použita hodnota OVER). To znamená, že událost se považuje za zpožděnou, pokud je její zvolené časové razítko (v klauzuli TIMESTAMP BY) příliš vzdálené od času jejího příchodu.

    Všimněte si, že použití velkých hodnot nezpožďuje zpoždění zpracování a události budou i nadále zpracovány okamžitě (nebo podle maximální tolerance mimo pořadí). Hodnota několika dnů není nepřiměřená. Použití výjimečně 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í jsou generovány při jejich výpočtu, což znamená, že výstupní události mohou mít mimo pořadí časové razítka; budou však v pořadí v rámci řazené <kolekce členů s jednou hodnotou over spec>.

Omezení a omezení

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

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

  2. Klauzule TIMESTAMP BY OVER se podporuje pouze u plně paralelních úloh nebo úloh s jedním oddílem.

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

  4. Pokud je použita klauzule TIMESTAMP BY OVER, musí být názvy sloupců z klauzule použity jako klíč seskupení v příkazech GROUP BY a ve všech predikátech JOIN při spojová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í se použít pole ze vstupní datové části. Například výsledek křížového použití nelze použít jako cílovou hodnotu ČASOVÉHO RAZÍTKA BY. Můžete však použít jednu úlohu Azure Stream Analytics, která provede operaci CROSS APPLY, a druhou úlohu k provedení časového razítka BY.

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

Příklady

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

Jako časové razítko události použijte EntryTime pole z datové části.

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

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

Systémy UNIX často používají čas POSIX (neboli Epocha) definovaný jako počet milisekund, které uplynuly od 00:00:00 koordinovaný univerzální čas (UTC) ve č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 mají data časového razítka v poli timestampA a události B mají časové razítko v poli timestampB.

Tento příklad ukazuje, jak napsat TIMESTAMP BY, aby bylo možné pracovat s oběma typy událostí/č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í několika č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ě TollId.

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

Viz také

System.Timestamp()
Zásady nerovnoměrného rozdělení času
Principy zpracování času v Azure Stream Analytics
UnixOvý čas