TIMESTAMP BY (Azure 串流分析)

所有資料流程事件都有與其相關聯的時間戳記。 根據預設,事件中樞的事件和IoT 中樞會根據事件中樞或IoT 中樞收到事件時時間戳記;來自 Blob 儲存體的事件會以 Blob 上次修改時間時間戳記。 如果您重新開機或重新執行作業,事件的時間戳記不會變更。

許多串流應用程式都需要使用事件發生的確切時間戳記,而不是抵達時間。 例如,在銷售點應用程式中,可能需要對應到記錄付款時間的事件時間戳記,而不是付款事件到達事件擷取服務的時間。 此外,異地分散式系統和網路延遲可能會造成無法預測的抵達時間,讓串流應用程式中的應用程式時間更可靠。 在這些情況下,TIMESTAMP BY 子句允許指定自訂時間戳記值。 此值可以是 DATETIME類型的事件承載或運算式中的任何欄位。 也支援符合任何 ISO 8601 格式的字串值。

請注意,使用自訂時間戳記 (TIMESTAMP BY 子句) 可能會導致 Azure 串流分析在其時間戳記上依序擷取事件,原因有兩個:

  • 個別事件產生者可能會有不同的 (和扭曲) 系統時鐘。
  • 來自個別事件產生者的事件可能會延遲傳輸中,例如,產生者網站的網路無法使用。

雖然事件產生者之間的雜亂可能很大,但單一產生者的事件內的混亂通常很小或甚至不存在。 如果查詢只會獨立處理來自每個事件產生者的資料,則處理來自每個產生者時間軸的事件比管理產生者之間的時間扭曲更有效率。 Azure 串流分析支援子串流,方法是指定 OVER < over over spec > 子句,以在獨立時程表中處理事件。 如需 OVER 子句對工作處理的影響,請參閱'OVER 子句與事件排序互動」。

語法

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

備註

擷取事件時間戳記

事件時間戳記可以使用 System.Timestamp () 屬性,在查詢的任何部分中擷取 SELECT 語句。

OVER 子句會與事件排序互動

使用 OVER 子句時,會修改 Azure 串流分析的數個事件處理層面:

  1. 在超過規格 > 的單一值 Tuple 內,會套用順序上限的 < 容錯。 也就是說,只有在事件與相同事件產生者的其他事件有太多順序不同時,事件才會被視為順序不足。

    例如,如果來自相同事件產生者的事件一律排序,而且會導致立即處理,則可以使用 '0' 的值。 另一方面,在這裡使用大型值將引進處理延遲,同時等候順序錯亂的事件進行組合。

  2. 全域套用延遲抵達容錯上限 (就像未使用 OVER) 一樣。 也就是說,如果在 TIMESTAMP BY 子句中選擇的時間戳記 (,事件會被視為延遲抵達,) 遠于抵達時間。

    請注意,在此使用大型值不會造成處理延遲,而且事件仍會立即處理 (,或根據順序上限的容錯) 。 值數天不合理。 不過,使用異常長的值可能會影響處理作業所需的記憶體數量。

  3. 每個事件產生者的輸出事件都會在計算時產生,這表示輸出事件可能有順序錯亂的時間戳記;不過,它們會依規格 > 的單一值元組 < 順序排列。

限制事項

TIMESTAMP BY OVER 子句具有下列使用限制:

  1. TIMESTAMP BY OVER 子句必須用於查詢的所有輸入,或未用於其中任何輸入。

  2. TIMESTAMP BY OVER 子句僅支援完全平行作業或單一資料分割作業。

  3. 如果輸入資料流程有多個資料分割,則 OVER 子句必須與 PARTITION BY 子句一起使用。 PartitionId 資料行必須指定為 TIMESTAMP BY OVER 資料行的一部分。

  4. 如果使用 TIMESTAMP BY OVER 子句,子句中的資料行名稱必須在 GROUP BY 語句和所有 JOIN 述詞中當做串流之間的聯結索引鍵使用。

  5. 在 SELECT 語句或任何其他查詢子句中建立的資料行不能用於 TIMESTAMP BY 子句中,必須使用輸入承載中的欄位。 例如, CROSS APPLY 的結果不能當做 TIMESTAMP BY 的目標值使用。 不過,您可以使用一個執行 CROSS APPLY 的 Azure 串流分析作業,並使用第二個作業來執行 TIMESTAMP BY。

  6. System.Timestamp () 無法用於 TIMESTAMP BY,因為 TIMESTAMP BY 是建立 System.Timestamp () 值的內容。

範例

範例 1 – 從承載存取時間戳記欄位

使用 EntryTime 承載中的欄位作為事件時間戳記

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

範例 2 – 使用來自承載的 UNIX 時間作為事件時間戳記

UNIX 系統通常會使用 POSIX (或 Epoch) 時間定義為自 00:00:00:00 國際標準時間 (UTC) ,星期四,1970 年 1 月 1 日經過的毫秒數。

此範例示範如何使用數值 'epochtime' 欄位,其中包含 Epoch 時間做為事件時間戳記。

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

範例 3 – 異質時間戳記

想像一下處理包含兩種事件 'A' 和 'B' 類型的資料異質資料流程。 事件 'A' 在欄位 'timestampA' 中具有時間戳記資料,而事件 'B' 在欄位 'timestampB' 中有時間戳記。

此範例示範如何撰寫 TIMESTAMP BY,以使用這兩種類型的事件/時間戳記。

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

範例 4 – 處理分割查詢中的多個時間軸

處理來自不同寄件者的資料 (收費站) ,而不需跨不同的付費站識別碼套用時間原則。 輸入資料會根據 TollId 進行分割。

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

另請參閱

System.Timestamp ()
時間偏差原則
了解 Azure 串流分析中的時間處理
Unix 時間