TIMESTAMP BY (Azure Stream Analytics)

すべてのデータ ストリーム イベントには、タイムスタンプが関連付けられています。 既定では、イベント ハブとIoT Hubからのイベントは、イベントがイベント ハブまたはIoT Hubによって受信された日時に基づいてタイムスタンプされます。BLOB ストレージからのイベントは、BLOB の最終変更時刻によってタイムスタンプされます。 ジョブを再実行または再実行しても、イベントのタイムスタンプは変更されません。

多くのストリーミング アプリケーションでは、到着時刻ではなく、イベントが発生した正確なタイムスタンプを使用する必要があります。 たとえば、Point of Sales アプリケーションでは、支払いイベントがイベント インジェスト サービスに到達する時間ではなく、支払いがログに記録された時刻に対応するイベント タイムスタンプが必要になる場合があります。 さらに、geo 分散システムとネットワークの待機時間は、予期しない到着時間に寄与し、ストリーミング アプリケーションでのアプリケーション時間の使用の信頼性が向上する可能性があります。 このような場合、TIMESTAMP BY 句ではカスタム タイムスタンプ値を指定できます。 値には、イベント ペイロードの任意のフィールド、または DATETIME 型の式を指定できます。 ISO 8601 形式のいずれかに準拠した文字列値もサポートされています。

カスタム タイムスタンプ (TIMESTAMP BY 句) を使用すると、次の 2 つの理由により、Azure Stream Analytics によってタイムスタンプに関してイベントが順に取り込まれる可能性があることに注意してください。

  • 個々のイベント プロデューサーには、異なる (偏った) システム クロックが含まれる場合があります。
  • 個々のイベント プロデューサーからのイベントは、たとえば、プロデューサーのサイトでネットワークを使用できないことによって、転送中に遅延する可能性があります。

イベントプロデューサー間の障害は大きくなる可能性があるが、単一のプロデューサーからのイベント内の障害は一般的に小さいか、存在しない。 クエリが各イベント プロデューサーからのデータのみを個別に処理する場合、プロデューサー間の時間のずれを管理するよりも、各プロデューサーからのイベントを独自のタイムラインで処理する方が効率的です。 Azure Stream Analytics では、OVER <over spec> サブ句を指定して独立したタイムラインでイベントの処理を有効にすることで、サブストリームがサポートされます。 OVER 句の使用がジョブの処理に与える影響については、「OVER 句とイベント順序の対話」を参照してください。

構文

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

解説

イベント タイムスタンプの取得

イベント タイムスタンプは、System.Timestamp() プロパティを使用して、クエリの任意の部分の SELECT ステートメントで取得できます。

OVER 句はイベントの順序付けと対話します

OVER 句を使用すると、Azure Stream Analytics によるイベント処理のいくつかの側面が変更されます。

  1. 最大順序外許容度は、over spec の <1 つの値タプル内に適用されます>。 つまり、イベントは、同じイベント プロデューサーからの他のイベントに対して順序が乱れすぎて到着した場合にのみ、順序が異なって見なされます。

    たとえば、同じイベント プロデューサーからのイベントが常に順序付けされ、すぐに処理される場合は、値 '0' を使用できます。 一方、ここで大きな値を使用すると、順序が異なったイベントがアセンブルされるのを待つ間に、処理の遅延が発生します。

  2. 到着遅延の最大許容度はグローバルに適用されます (OVER が使用されていない場合と同様)。 つまり、選択したタイムスタンプ (TIMESTAMP BY 句内) が到着時刻から遠すぎる場合、イベントは遅延到着と見なされます。

    ここで大きな値を使用しても処理の遅延は発生せず、イベントは直ちに処理されます (または、最大順序外許容度に従います)。 数日間の値は、不合理ではありません。 ただし、非常に長い値を使用すると、ジョブの処理に必要なメモリ量に影響する可能性があります。

  3. 各イベント プロデューサーの出力イベントは、計算時に生成されます。つまり、出力イベントに順不同のタイムスタンプが含まれる可能性があります。ただし、これらは over spec の単一値タプル <内で順番に並べられます>。

制限事項と制約事項

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 を実行する 1 つの Azure Stream Analytics ジョブを使用し、2 つ目のジョブを使用して TIMESTAMP BY を実行できます。

  6. TIMESTAMP BY は System.Timestamp() の値を確立するため、SYSTEM.Timestamp() は TIMESTAMP BY では使用できません。

例 1 – ペイロードからタイムスタンプ フィールドにアクセスする

ペイロードのフィールドをイベント タイムスタンプとして使用 EntryTime する

SELECT  
      EntryTime,  
      LicensePlate,  
      State   
FROM input TIMESTAMP BY EntryTime  

例 2 – ペイロードからの UNIX 時刻をイベント タイムスタンプとして使用する

UNIX システムでは、多くの場合、1970 年 1 月 1 日木曜日の 00:00:00 協定世界時 (UTC) から経過したミリ秒数として定義された POSIX (またはエポック) 時間が使用されます。

この例では、イベント タイムスタンプとしてエポック時間を含む数値 'epochtime' フィールドを使用する方法を示します。

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

例 3 – 異種タイムスタンプ

2 種類のイベント '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 – パーティション分割されたクエリで複数のタイムラインを処理する

異なる有料ステーション ID に時間ポリシーを適用せずに、異なる送信者 (有料局) からのデータを処理します。 入力データは 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 Stream Analytics での時間の処理について
Unix 時刻