您正在查看 Debezium 未发布版本的文档。
如果您想查看此页面的最新稳定版本,请在此 查看。

时区转换器

当 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.0.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.0.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