12.12. Debezium イベントレコードのタイムゾーン値の変換
Debezium がイベントレコードを発行する場合、レコード内のタイムスタンプフィールドのタイムゾーン値は、データソースのタイプと設定に応じて異なる場合があります。データ処理パイプラインおよびアプリケーション内でデータの整合性と精度を維持するには、Timezone Converter
SMT を使用して、イベントレコードが一貫したタイムゾーンでタイムスタンプデータを表すようにします。
SMT は、converted.timezone
設定オプションを使用して、指定されたフィールドの値をターゲットタイムゾーンに変換します。ターゲットタイムゾーンは、America/New_York
などの地理的タイムゾーンとして指定することも、+02:00
などの UTC オフセットとして指定することもできます。レコードのフィールドは UTC であることを前提としています。SMT は、指定されたタイムゾーンに加えて、include.list
および exclude.list
設定オプションを使用して、特定のフィールドをタイムゾーン変換に含めたり除外したりする設定オプションも提供します。
SMT は、すべての Debezium および Kafka Connect の一時的および非一時的なタイプをサポートします。
詳細は以下のセクションを参照してください。
夏時間に準拠するには、converted.timezone
設定オプションで地理的タイムゾーンを指定する必要があります。UTC オフセットを指定すると、変換により UTC からの固定オフセットが適用されますが、これは夏時間を採用している地域では不正確になります。固定の UTC オフセットの指定は、夏時間を採用していない特定のタイムゾーンにタイムスタンプフィールドを変換するときに便利です。
include.list
と exclude.list
の設定オプションは相互に排他的です。これらのオプションのいずれかのみを指定する必要があります。
12.12.1. 例: 基本的な Debezium タイムゾーンコンバーター SMT 設定
コネクターの Kafka Connect 設定で TimezoneConverter
SMT を設定して、イベントレコード内の時間ベースのフィールドをターゲットタイムゾーンに変換します。
たとえば、イベントレコード内のすべてのタイムスタンプフィールドを UTC から Pacific/Easter
タイムゾーンに変換するには、コネクター設定に次の行を追加します。
transforms=convertTimezone transforms.convertTimezone.type=io.debezium.transforms.TimezoneConverter transforms.convertTimezone.converted.timezone=Pacific/Easter
12.12.1.1. TimezoneConverter
SMT を Debezium イベントレコードに適用した場合の効果
次の例は、TimezoneConverter
変換がイベントレコードのタイムスタンプフィールドを変更する方法を示しています。最初の例は、変換によって処理されない Debezium イベントレコードを示しています。レコードは元のタイムスタンプ値を保持します。次の例は、変換の適用後と同じイベントレコードを示しています。基本設定例で指定した設定 に従って、SMT はソースメッセージのタイムスタンプフィールドの元の UTC 値を Pacific/Easter
タイムゾーン値に変換します。
例12.3 TimezoneConverter
変換による処理前のイベントレコード値
created_at
フィールドの値は UTC 時間を示します。
{ "before": null, "after": { "id": 1, "first_name": "Anne", "last_name": "Kretchmar", "email": "annek@noanswer.org", "created_at": "2011-01-11T16:40:30.123456789+00:00" }, "source": { "version": "2.5.4.Final", "connector": "postgresql", "name": "PostgreSQL_server", "ts_ms": 1559033904863, "snapshot": true, "db": "postgres", "sequence": "[\"24023119\",\"24023128\"]", "schema": "public", "table": "customers", "txId": 555, "lsn": 24023128, "xmin": null }, "op": "c", "ts_ms": 1559033904863 }
例12.4 TimezoneConverter
変換による処理後のイベントレコード値
SMT は、created_at
フィールドの元の UTC 値を、基本設定 の例で指定されたターゲットタイムゾーンである Pacific/Easter
の時間に変換します。SMT は event_timestamp
フィールドも追加します。
{ "before": null, "after": { "id": 1, "first_name": "Anne", "last_name": "Kretchmar", "email": "annek@noanswer.org", "created_at": "2011-01-11T11:40:30.123456789-05:00" }, "source": { "version": "2.5.4.Final", "connector": "postgresql", "name": "PostgreSQL_server", "ts_ms": 1559033904863, "snapshot": true, "db": "postgres", "sequence": "[\"24023119\",\"24023128\"]", "schema": "public", "table": "customers", "txId": 555, "lsn": 24023128, "xmin": null, "id": 100 }, "op": "c", "ts_ms": 1559033904863, "event_timestamp": 1626102708861 }
12.12.2. 例: 高度な Debezium タイムゾーンコンバーター SMT 設定
イベントレコード内のすべてのタイムスタンプフィールドを変換するのではなく、特定のフィールドのみを変換するように SMT を設定できます。次の例は、SMT 設定の include.list
オプションを使用して、イベントレコード内の created_at
および updated_at
タイムスタンプフィールドのみを変換する方法を示しています。次の設定では、地理的タイムゾーン指定子ではなく固定オフセットを使用して、時間を UTC から +05:30
に変換します。
transforms=convertTimezone transforms.convertTimezone.type=io.debezium.transforms.TimezoneConverter transforms.convertTimezone.converted.timezone=+05:30 transforms.convertTimezone.include.list=source:customers:created_at,customers:updated_at
場合によっては、特定のタイムスタンプフィールドをタイムゾーン変換から除外することが必要な場合があります。たとえば、イベントレコードの updated_at
タイムスタンプフィールドをタイムゾーン変換から除外するには、次の例のように exclude.list
設定オプションを使用します。
transforms=convertTimezone transforms.convertTimezone.type=io.debezium.transforms.TimezoneConverter transforms.convertTimezone.converted.timezone=+05:30 transforms.convertTimezone.exclude.list=source:customers:updated_at
12.12.3. Debezium タイムゾーンコンバーター変換を設定するためのオプション
次の表に、TimezoneConverter
SMT の設定オプションのリストを示します。
プロパティー | 説明 | 型 | 重要性 |
タイムスタンプフィールドを変換するターゲットタイムゾーンを指定する文字列。ターゲットタイムゾーンは、 | string | 高 | |
SMT がタイムゾーン変換に含めるフィールドを指定するルールのコンマ区切りリスト。次のいずれかの形式を使用してルールを指定します。
| list | medium | |
タイムゾーン変換から除外するフィールドを指定するルールのコンマ区切りリスト。次のいずれかの形式を使用してルールを指定します。
| list | medium |