You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kafka Connect Debezium MySQL源连接器如何消除消息Key中的Struct{}结构

你使用的Flatten SMT仅能将嵌套的Struct结构扁平化生成带层级分隔符的字段名(例如将Struct{user=Struct{id=1}}转换为Struct{user.id=1}),无法将单字段Struct直接转换为对应的标量值,因此配置后不生效。Debezium默认会将所有主键(即使是单字段主键)封装为Struct结构输出,才会导致下游Sink读取到Struct{id=x}格式的异常值。

解决方案

按实现成本从低到高推荐如下两种方案:

方案1:使用Debezium内置配置(推荐,适配Debezium 1.9及以上版本)

直接在源连接器配置中添加如下参数即可,无需额外引入SMT,适配多表同步、单/多主键场景:

key.force.struct=false

该配置开启后,Debezium会自动判断主键字段数量:单字段主键直接返回标量值作为消息Key,多字段主键保留Struct封装。

方案2:使用ExtractField SMT提取主键值(适配所有Debezium版本,仅适用单主键单表同步场景)

替换你之前配置的Flatten SMT为如下配置即可:

transforms=extractPrimaryKey
transforms.extractPrimaryKey.type=org.apache.kafka.connect.transforms.ExtractField$Key
# 此处填写你的表主键字段名
transforms.extractPrimaryKey.field=id
配置验证与下游适配

配置更新后可通过Kafka自带的控制台消费者验证消息Key格式是否符合预期:

kafka-console-consumer.sh --bootstrap-server <Kafka集群地址> --topic <对应业务Topic名称> --from-beginning --property print.key=true

正常输出的消息Key应为1这类纯数值,而非Struct结构。
同时需要确认下游Sink连接器的pk.mode配置为record_key,确保Sink直接读取消息Key作为目标表的主键值。

内容的提问来源于stack exchange,提问作者felicienb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 21:36:04