时区转换器

当 Debezium 发出事件记录时,记录中时间戳字段的时区值可能会有所不同,具体取决于数据源的类型和配置。为了在数据处理管道和应用程序中保持数据的一致性和精度,您可以使用 Timezone Converter SMT 来确保事件记录使用一致的时区来表示时间戳数据。

SMT 使用 converted.timezone 配置选项将指定字段的值转换为目标时区。您可以将目标时区指定为地理时区,例如 America/New_York,或指定为 UTC 偏移量,例如 +02:00。假定记录的字段以 UTC 格式表示。除了指定时区外,SMT 还提供了使用 include.listexclude.list 配置选项来包含或排除特定字段进行时区转换的选项。

SMT 支持所有 Debezium 和 Kafka Connect 的时间类型和非时间类型。

为了遵守夏令时,您必须在 converted.timezone 配置选项中指定一个地理时区。如果您指定了一个 UTC 偏移量,该转换只会应用固定的 UTC 偏移量,而对于遵守夏令时的地区,这种方式并不准确。当您想将时间戳字段转换为不遵守夏令时的特定时区时,提供固定的 UTC 偏移量会很有用。

include.listexclude.list 配置选项是互斥的。您只能指定其中一个选项。

SMT 还允许转换源信息块中的事件元数据字段,例如 ts_ms,到目标时区。为了转换元数据字段,您必须在 include.listexclude.list 配置选项的 fieldname 中包含 source 前缀。

如果源信息块中时间戳字段(如 ts_ms)的模式当前设置为 INT64(这不是一个时间戳类型),未来的版本旨在通过引入对时间戳模式的兼容性来支持对这些字段的转换。

示例:基本配置

在连接器的 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 时区值。

示例 1. 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
    }
示例 2. 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_atupdated_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 的配置选项。

表 1. TimezoneConverter SMT 配置选项

属性

描述

Type

重要性

一个字符串,指定应将时间戳字段转换到的目标时区。目标时区可以指定为地理时区,例如 America/New_York,或指定为 UTC 偏移量,例如 +02:00

string

一个逗号分隔的规则列表,指定 SMT 要包含在时区转换中的字段。使用以下格式之一指定规则

source:<tablename>

匹配具有指定表名的源信息块的 Debezium 更改事件。SMT 会转换匹配表中所有基于时间字段。

source:<tablename>:<fieldname>

匹配具有指定表名的源信息块的 Debezium 更改事件。SMT 只会转换指定表中具有指定字段名的字段。fieldname 可以加上 beforeaftersource 前缀来包含事件记录中的相应字段。如果未指定前缀,则会转换 beforeafter 字段。

topic:<topicname>

匹配来自指定主题名的事件,并转换事件记录中的所有基于时间字段。

topic:<topicname>:<fieldname>

匹配来自指定主题名的事件,并且只转换指定字段的值。fieldname 可以加上 beforeaftersource 前缀来包含事件记录中的相应字段。如果未指定前缀,则会转换 beforeafter 字段。

<matchname>:<fieldname>

应用一个启发式匹配算法,匹配源信息块的表名(如果存在);否则,匹配主题名。SMT 只转换指定字段名的值。fieldname 可以加上 beforeaftersource 前缀来包含事件记录中的相应字段。如果未指定前缀,则会转换 beforeafter 字段。

列表

medium

一个逗号分隔的规则列表,指定要从时区转换中排除的字段。使用以下格式之一指定规则

source:<tablename>

匹配具有指定表名的源信息块的 Debezium 更改事件。SMT 会排除匹配表中所有基于时间字段的转换。

source:<tablename>:<fieldname>

匹配具有指定表名的源信息块的 Debezium 更改事件。SMT 会排除指定表中与指定字段名匹配的字段的转换。fieldname 可以加上 beforeaftersource 前缀来排除事件记录中的相应字段。如果未指定前缀,则会排除 beforeafter 字段的转换。

topic:<topicname>

匹配来自指定主题名的事件,并排除该主题中所有基于时间字段的转换。

topic:<topicname>:<fieldname>

匹配来自指定主题名的事件,并排除该主题中具有指定名称的任何字段的转换。fieldname 可以加上 beforeaftersource 前缀来排除事件记录中的相应字段。如果未指定前缀,则会排除 beforeafter 字段的转换。

<matchname>:<fieldname>

应用一个启发式匹配算法,匹配源信息块的表名(如果存在);否则,匹配主题名。SMT 只排除具有指定名称的字段的转换。fieldname 可以加上 beforeaftersource 前缀来包含事件记录中的相应字段。如果未指定前缀,则会排除 beforeafter 字段的转换。

列表

medium