7.12. 在 Debezium 事件记录中转换时区值
当 Debezium 发出事件记录时,记录中时间戳字段的时区值可能会有所不同,具体取决于数据源的类型和配置。要在数据处理管道和应用程序内保持数据一致性和精度,您可以使用 Timezone Converter
SMT 来确保事件记录使用一致的时区来代表时间戳数据。
SMT 使用 converted.timezone
配置选项将指定字段的值转换为目标时区。您可以将目标时区指定为地理时区,如 America/New_York
或 UTC 偏移,如 +02:00
。假设记录的字段为 UTC。除了指定的时区,SMT 还提供配置选项,以使用 include.list
和 exclude.list
配置选项从时区转换中包含或排除特定字段。
SMT 支持所有 Debezium 和 Kafka Connect temporal 和 non-temporal 类型。
以下主题提供详情:
要遵守夏时节省时间,您必须在 converted.timezone
配置选项中指定地理时区。如果您指定了 UTC 偏移,则转换会应用来自 UTC 的固定偏移量,该偏移对于观察日常节省时间的区域不准确。当将时间戳字段转换为不观察每天节省时间的特定时区时,提供固定的 UTC 偏移非常有用。
include.list
和 exclude.list
配置选项是互斥的。您必须只指定其中一个选项。
SMT 还支持将源信息块中的事件元数据字段转换为目标时区,如 ts_ms
。要转换元数据字段,您必须在 include.list
或 exclude.list
配置选项的 fieldname
中包含 源
前缀。
如果源信息块中时间戳字段的模式(如 ts_ms
)当前被设置为 INT64
,这不是时间戳类型,则以后的发行版本旨在通过引入时间戳模式的兼容性来支持此类字段的转换。
7.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
7.12.1.1. 将 TimezoneConverter
SMT 应用到 Debezium 事件记录的影响
以下示例演示了 TimezoneConverter
转换如何修改事件记录中的 timestamp 字段。第一个示例演示了一个 Debezium 事件记录,它没有被转换处理;记录会保留其原始时间戳值。下一个示例演示了在应用转换后相同的事件记录。根据 基本配置示例中指定的配置,SMT 会将源消息中的原始 UTC 时间戳字段转换为 Pacific/Easter
时区值。
例 7.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": "3.0.8.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
}
Copy to clipboardCopied例 7.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": "3.0.8.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
}
Copy to clipboardCopied7.12.2. 示例:高级 Debezium converter SMT 配置
您可以将 SMT 配置为仅转换特定字段,而不是转换事件记录中的所有时间戳字段。以下示例演示了如何在 SMT 配置中使用 include.list
选项,来仅在事件记录中转换 created_at
、update_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
7.12.3. 用于配置 Debezium 时区转换器转换的选项
下表列出了 TimezoneConverter
SMT 的配置选项。
属性 | 描述 | 类型 | 重要信息 |
指定应转换时间戳字段的目标时区的字符串。目标时区可以指定为地理时区,如 | string | high | |
以逗号分隔的规则列表,用于指定 SMT 包括的字段进行时区转换。使用以下格式之一指定规则:
| list | 中 | |
以逗号分隔的规则列表,用于指定要从时区转换中排除的字段。使用以下格式之一指定规则:
| list | 中 |