Realtime Compute は、時間属性に基づくデータのウィンドウ集約をサポートしています。 Event Time ベースのウィンドウ関数を実行するジョブの場合、ソーステーブルの宣言で透かしメソッドを使用する必要があります。

透かしは、Event Time の進捗の測定に使用されるメカニズムです。 これは非表示のデータ属性です。 透かしの定義は、ソーステーブルの DDL 定義の一部です。 Flink は透かしを定義するために次の構文を提供します。

Realtime Compute の 時間属性の詳細については、「時間属性」をご参照ください。
WATERMARK [watermarkName] FOR <rowtime_field> AS withOffset(<rowtime_field>, offset)
		
名前 説明
watermarkName 透かしの名前です。 このパラメーターは省略可能です。
<rowtime_field> 透かしの生成に使用される列です。 この列は [Event Time] 列として識別され、後続のクエリでウィンドウを定義するために使用できます。 パラメーター値は、テーブルで定義された列である必要があります。 TIMESTAMP 型の列のみがサポートされています。
withOffset 透かしの生成ポリシーです。 透かしの値は、式 <rowtime_field> - offset に基づいて生成されます。 withOffset の最初のパラメーターは <rowtime_field> である必要があります。
offset 透かしの値と Event Time の値の間のオフセットです。 単位はミリ秒です。

一般に、データレコードのフィールドは、レコードが生成された時刻を示します。 たとえば、テーブルには TIMESTAMP 型の rowtime フィールドがあり、1 つのフィールドの値は 1501750584000 (2017-08-03 08:56:24.000) です。 rowtime フィールドに基づいて透かしを定義し、透かしポリシーに 4 秒のオフセットを設定する場合、次の定義を追加します。

WATERMARK FOR rowtime AS withOffset(rowtime, 4000)
		

この例では、データレコードの透かし時間は 1501750584000 - 4000 = 1501750580000 (2017-08-03 08:56:20.000) です。 これは、タイムスタンプが 1501750580000 (2017-08-03 08:56:20.000) よりも前のすべてのデータが届いていることを意味します。

  • Event Time ベースの透かしを使用する場合、rowtime フィールドは TIMESTAMP 型である必要があることに注意してください。 現在、Realtime Compute は、ミリ秒単位の 13 桁の UNIX タイムスタンプをサポートしています。 rowtime フィールドが別の型であるか、UNIX タイムスタンプの長さが 13 桁ではない場合は、計算列を使用して時間を変換することを推奨します。
  • Event TimeProcessing Time は、ソーステーブルでのみ宣言できます。
まとめ
  • 透かしは、透かし時間 t よりも前のタイムスタンプ (t') を持つすべてのイベント (t'< t ) は発生済みであることを示します。 透かし時間 t が有効化された後に受信される、Event Time が t よりも前のすべてのレコードは破棄されます。 これが、現在 Realtime Compute で使用されているメカニズムです。 将来的には、Realtime Compute で構成を変更して、後のデータも更新できるようになる予定です。
  • 透かしは、一部のイベントの到着が遅れた場合でもウィンドウが正しく計算される可能性を最大化するため、順序が狂ったデータストリームでは特に重要です。
  • 演算子が並列処理のために複数の入力データストリームを持っている場合、最も短い時間のデータストリームの Event Time が、演算子での Event Time として使用されます。