搜索

4.2. Debezium JDBC 连接器如何映射数据类型

download PDF

Debezium JDBC sink 连接器使用逻辑或原语类型解析列的数据类型。原语类型包括整数、浮点、布尔值、字符串和字节数等值。通常,这些类型只通过特定的 Kafka Connect Schema 类型代码表示。逻辑数据类型更为复杂的类型,包括 Struct (基于 Struct)类型,其具有固定的字段名称和模式,或者以特定编码表示的值,如自 epoch 起的天数。

以下示例演示了原语和逻辑数据类型的代表结构:

Primitive 字段 schema

{
  "schema": {
    "type": "INT64"
  }
}

逻辑字段模式

[
  "schema": {
    "type": "INT64",
    "name": "org.apache.kafka.connect.data.Date"
  }
]

Kafka Connect 不是这些复杂逻辑类型的唯一源。实际上,Debezium 源连接器生成更改事件,它们具有类似逻辑类型的字段,以表示各种不同的数据类型,包括但不限于、时间戳、日期甚至 JSON 数据。

Debezium JDBC sink 连接器使用这些原语和逻辑类型,将列的类型解析为 JDBC SQL 代码,后者代表列的类型。然后,底层 Hibernate 持久性框架使用这些 JDBC SQL 代码,将列的类型解析为使用中的逻辑数据类型。下表说明了 Kafka Connect 和 JDBC SQL 类型之间以及 Debezium 和 JDBC SQL 类型之间的原语和逻辑映射。实际的最后一列类型因每种数据库类型而异。

表 4.1. Kafka Connect Primitives 和 Column 数据类型之间的映射
原语类型JDBC SQL 类型

INT8

Type.TINYINT

INT16

Type.SMALLINT

INT32

Type.INTEGER

INT64

Type.BIGINT

FLOAT32

Type.FLOAT

FLOAT64

Type.DOUBLE

布尔值

Type.BOOLEAN

字符串

Type.CHAR, Types.NCHAR, Types.VARCHAR, Types.NVARCHAR

BYTES

类型.VARBINARY

表 4.2. Kafka Connect 逻辑类型和列数据类型之间的映射
逻辑类型JDBC SQL 类型

org.apache.kafka.connect.data.Decimal

Type.DECIMAL

org.apache.kafka.connect.data.Date

type.DATE

org.apache.kafka.connect.data.Time

Type.TIMESTAMP

org.apache.kafka.connect.data.Timestamp

Type.TIMESTAMP

表 4.3. Debezium 逻辑类型和列数据类型之间的映射
逻辑类型JDBC SQL 类型

io.debezium.time.Date

type.DATE

io.debezium.time.Time

Type.TIMESTAMP

io.debezium.time.MicroTime

Type.TIMESTAMP

io.debezium.time.NanoTime

Type.TIMESTAMP

io.debezium.time.ZonedTime

Types.TIME_WITH_TIMEZONE

io.debezium.time.Timestamp

Type.TIMESTAMP

io.debezium.time.MicroTimestamp

Type.TIMESTAMP

io.debezium.time.NanoTimestamp

Type.TIMESTAMP

io.debezium.time.ZonedTimestamp

Types.TIMESTAMP_WITH_TIMEZONE

io.debezium.data.VariableScaleDecimal

Type.DOUBLE

重要

如果数据库不支持带有时区的时间或时间戳,则映射会解析到没有时区的等效时间。

表 4.4. Debezium 特定逻辑类型和 Column 数据类型之间的映射
逻辑类型MySQL SQL 类型PostgreSQL SQL 类型SQL Server SQL 类型

io.debezium.data.Bits

bit(n)

位(n)位的不同

varbinary(n)

io.debezium.data.Enum

Enum

Type.VARCHAR

不适用

io.debezium.data.Json

json

json

不适用

io.debezium.data.EnumSet

set

不适用

不适用

io.debezium.time.Year

year (n)

不适用

不适用

io.debezium.time.MicroDuration

不适用

interval

不适用

io.debezium.data.Ltree

不适用

ltree

不适用

io.debezium.data.Uuid

不适用

uuid

不适用

io.debezium.data.Xml

不适用

xml

xml

除了上述原语和逻辑映射外,如果更改事件的来源是 Debezium 源连接器、列类型的解析及其长度、精度和规模,可以通过启用列或数据类型传播来进一步影响。要强制传播,必须在源连接器配置中设置以下属性之一:

  • column.propagate.source.type
  • datatype.propagate.source.type

Debezium JDBC sink 连接器应用具有较高优先级的值。

例如,假设更改事件中包含以下字段模式:

Debezium 更改事件字段 schema,启用了列或数据类型传播

{
  "schema": {
    "type": "INT8",
    "parameters": {
      "__debezium.source.column.type": "TINYINT",
      "__debezium.source.column.length": "1"
    }
  }
}

在上例中,如果没有设置 schema 参数,Debezium JDBC sink 连接器会将此字段映射到 type .SMALLINTType.SMALLINT 可以有不同的逻辑数据库类型,具体取决于数据库问题。对于 MySQL,示例中的列类型转换为没有指定长度的 TINYINT 列类型。如果为源连接器启用了列或数据类型传播,Debezium JDBC sink 连接器会使用映射信息来优化数据类型映射过程,并使用类型 TINYINT (1) 创建列。

注意

通常,当源和 sink 数据库使用相同的数据库类型时,使用列或数据类型传播的影响会大得多。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.