Kafka Connect JDBC Source数值与时间戳显示异常问题求助
解决Confluent 3.2.2 Kafka Connect JDBC Source的数值与时间戳格式问题
我很熟悉Confluent早期版本的Kafka Connect JDBC连接器限制,你遇到的问题主要是因为3.2.2版本还不支持numeric.mapping配置,同时默认的类型序列化逻辑导致了数值和时间戳的显示不符合预期,下面给你几个可行的解决方案:
一、处理数值字段(Decimal转普通数值类型)
由于3.2.2版本的JDBC连接器没有numeric.mapping参数,我们可以通过自定义SQL查询强制转换字段类型,绕过默认的Decimal映射:
- 修改连接器配置,将
table.name替换为query参数,在SQL中显式把Decimal类型的字段转换为整数/长整型:
name=jdbc-teradata-source-connector connector.class=io.confluent.connect.jdbc.JdbcSourceConnector tasks.max=1 connection.url=... # 移除无效的numeric.maping配置 topic.prefix=test-2 mode=timestamp+incrementing timestamp.column.name=LAST_LOGIN incrementing.column.name=ID # 自定义查询,强制转换数值字段类型 query=SELECT CAST(ID AS BIGINT) AS ID, CAST(TENANT_ID AS BIGINT) AS TENANT_ID, CAST(IS_ACTIVE AS SMALLINT) AS IS_ACTIVE, CREATION_DATE, LAST_LOGIN, NAME, MOBILEPHONE, EMAIL, USERNAME, PASSWORD, EXTERNAL_ID FROM your_target_table
这样连接器会将转换后的字段识别为普通的整数类型,payload中就会显示正常的数值,而不是Base64编码的Decimal字节。
- 如果你不想修改查询语句,也可以考虑自定义Converter(需要少量开发):
实现一个自定义的Converter,拦截Decimal类型的字段,将Base64解码后的字节转换为对应的数值。不过这个方案复杂度更高,优先推荐SQL转换的方式。
二、处理时间戳字段(长整型转可读字符串)
时间戳显示为int64长整型是默认JsonConverter的序列化逻辑导致的,你可以通过配置Converter的时间戳格式化参数来解决:
在连接器配置中添加以下Converter相关参数:
value.converter=org.apache.kafka.connect.json.JsonConverter value.converter.schemas.enable=true # 指定时间戳的格式化字符串,可根据需求调整 value.converter.timestamp.format=yyyy-MM-dd'T'HH:mm:ss.SSSZ
配置后,时间戳字段会被序列化成类似2019-05-09T12:17:17.030+0800的可读字符串,而不是毫秒数。
三、额外的配置注意事项
- 你的配置中
numeric.maping存在拼写错误,正确的参数名是numeric.mapping,但3.2.2版本不支持该参数,建议直接移除。 - 避免同时设置
topic和topic.prefix,两者二选一即可,防止topic名称冲突。
内容的提问来源于stack exchange,提问作者A. Gisbert
相关产品推荐
相关产品推荐

