时区转换器
当 Debezium 发出事件记录时,记录中时间戳字段的时区值可能会有所不同,具体取决于数据源的类型和配置。为了在数据处理管道和应用程序中保持数据的一致性和精度,您可以使用 Timezone Converter SMT 来确保事件记录使用一致的时区来表示时间戳数据。
SMT 使用 converted.timezone 配置选项将指定字段的值转换为目标时区。您可以将目标时区指定为地理时区,例如 America/New_York,或指定为 UTC 偏移量,例如 +02:00。假定记录的字段以 UTC 格式表示。除了指定时区外,SMT 还提供了使用 include.list 和 exclude.list 配置选项来包含或排除特定字段进行时区转换的选项。
SMT 支持所有 Debezium 和 Kafka Connect 的时间类型和非时间类型。
|
为了遵守夏令时,您必须在 |
|
|
SMT 还允许转换源信息块中的事件元数据字段,例如 ts_ms,到目标时区。为了转换元数据字段,您必须在 include.list 或 exclude.list 配置选项的 fieldname 中包含 source 前缀。
|
如果源信息块中时间戳字段(如 |
示例:基本配置
在连接器的 Kafka Connect 配置中配置 TimezoneConverter SMT,以将事件记录中的基于时间字段转换为目标时区。
例如,要将事件记录中的所有时间戳字段从 UTC 转换为 Pacific/Easter 时区,请将以下行添加到您的连接器配置中
transforms=convertTimezone
transforms.convertTimezone.type=io.debezium.transforms.TimezoneConverter
transforms.convertTimezone.converted.timezone=Pacific/Easter
应用 TimezoneConverter SMT 的效果
以下示例展示了 TimezoneConverter 转换如何修改事件记录中的时间戳字段。第一个示例显示了一个未经转换处理的 Debezium 事件记录;该记录保留了其原始时间戳值。下一个示例显示了应用转换后的同一事件记录。根据 基本配置示例 中指定的配置,SMT 将源消息中时间戳字段的原始 UTC 值转换为 Pacific/Easter 时区值。
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": "3.3.1.Final",
"connector": "postgresql",
"name": "PostgreSQL_server",
"ts_ms": 1559033904863,
"ts_us": 1559033904863000,
"ts_ns": 1559033904863000000,
"snapshot": true,
"db": "postgres",
"sequence": "[\"24023119\",\"24023128\"]",
"schema": "public",
"table": "customers",
"txId": 555,
"lsn": 24023128,
"xmin": null
},
"op": "c",
"ts_ms": 1559033904863,
"ts_us": 1559033904863875,
"ts_ns": 1559033904863875124
}
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": "3.3.1.Final",
"connector": "postgresql",
"name": "PostgreSQL_server",
"ts_ms": 1559033904863,
"ts_us": 1559033904863752,
"ts_ns": 1559033904863752000,
"snapshot": true,
"db": "postgres",
"sequence": "[\"24023119\",\"24023128\"]",
"schema": "public",
"table": "customers",
"txId": 555,
"lsn": 24023128,
"xmin": null,
"id": 100
},
"op": "c",
"ts_ms": 1559033904863,
"ts_us": 1559033904863971,
"ts_ns": 1559033904863971541,
"event_timestamp": 1626102708861
}
示例:高级配置
除了转换事件记录中的所有时间戳字段外,您还可以配置 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
配置选项
下表列出了 TimezoneConverter SMT 的配置选项。
属性 |
描述 |
Type |
重要性 |
一个字符串,指定应将时间戳字段转换到的目标时区。目标时区可以指定为地理时区,例如 |
string |
高 |
|
一个逗号分隔的规则列表,指定 SMT 要包含在时区转换中的字段。使用以下格式之一指定规则
|
列表 |
medium |
|
一个逗号分隔的规则列表,指定要从时区转换中排除的字段。使用以下格式之一指定规则
|
列表 |
medium |