Confluent 6.0.1 Kafka Connect时间戳转换写Postgres报错
问题根因定位
- 不配置转换规则时的Postgres类型不匹配报错:你定义的Avro Schema里
DATE_TIME是字符串类型,JDBC Sink会直接把这个值映射为数据库的varchar类型,和Postgres表里预设的timestamp with time zone字段类型不兼容,自然会触发校验报错。 - 配置转换规则后的Connect阶段报错:核心问题是Transform的参数名写错了。
TimestampConverter这个内置SMT里,用来指定Struct消息中待转换时间字段的合法参数是field,你写的target.field不是该SMT会识别的配置项,导致SMT没有获取到字段定位信息,默认把整条消息(Struct结构)当成要转换的时间字段做格式校验,Struct结构肯定不满足时间类型的格式要求,才会抛出“Schema does not correspond to a known timestamp type format”的错误。
正确配置修改
把原来Transform段落的配置替换成下面的内容:
# Transforms transforms=TimestampConverter transforms.TimestampConverter.type=org.apache.kafka.connect.transforms.TimestampConverter$Value # 用field参数指定要转换的源字段,不要写target.field transforms.TimestampConverter.field=DATE_TIME transforms.TimestampConverter.format=yyyy-MM-dd HH:mm:ss transforms.TimestampConverter.target.type=Timestamp
后续校验注意事项
- 你使用Confluent AvroConverter做消息序列化,配置里的
key.converter.schemas.enable=false、value.converter.schemas.enable=false对AvroConverter没有作用,这两个参数是JsonConverter、StringConverter的专属配置,留着不会影响运行但属于冗余配置,可以直接删掉。 - 你用的时间格式
yyyy-MM-dd HH:mm:ss没有时区信息,TimestampConverter会按照Connect Worker进程所在JVM的默认时区解析字符串值,要确保JVM时区和Postgres数据库的时区配置保持一致,避免写入的时间值出现时区偏移。 - 完成上述调整后,SMT会把Struct里的字符串类型
DATE_TIME转换为Connect Timestamp类型,JDBC Sink可以直接把这个值映射到Postgres的timestamp with time zone字段,不会再出现类型不匹配的报错。 - 因为你的目标表是预先建好的,
auto.create=false的配置是正确的,不需要调整。
内容的提问来源于stack exchange,提问作者Biswajit Kumar
相关产品推荐
相关产品推荐

