![](/img/trans.png)
[英]JDBC Sink Connector: How to map fields from the Kafka's message to the database table's column
[英]extract and transform kafka message specific fields for jdbc sink connector
我有一个 kafka 主题,它使用 Debezium mysql 源连接器从 mysql 数据库中获取数据,以下是其中一条消息的格式:
{
"Message": {
"schema": {
"type": "struct",
"fields": [
...
],
"optional": true,
"name": "mysql-server-1.inventory.somename"
},
"payload": {
"op": "u",
"ts_ms": 1465491411815,
"before": {
"id": 1004,
"first_name": "Anne",
"last_name": "Doof",
"email": "annek@noanswer.org"
},
"after": {
"id": 1004,
"first_name": "Anne",
"last_name": "Marry",
"email": "annek@noanswer.org"
},
"source": {
"db": "inventory",
"table": "customers",
...
"query": "Update customers set last_name = 'Marry' where id = 1004"
}
}
}
}
我想使用 jdbc 接收器连接器将ts_ms, before, after
和id
(来自对象/行)列推送到另一个数据库中,表模式为(id,before(text),after(text),timestamp)
,是 kafka 的新手想不通:
我如何仅从消息中提取这些字段以推送并忽略其他字段?
如何在字段之前、之后转换为字符串/序列化格式?
如何从 object 中提取id
? (在插入操作的情况下,之前将为 null,对于删除,之后将为空)
对于上面的消息,sink 目标表最后应该有如下数据:
id: 1004
before: '{"id":1004,"first_name":"Anne","last_name":"Doof","email":"annek@noanswer.org"}'
after: '{"id":1004,"first_name":"Anne","last_name":"Marry","email":"annek@noanswer.org"}'
timestamp: 1465491411815
您可以使用Kafka Connect 转换链,就像这个解决方案一样。
You can create a DTO (Java object for your json payload which you are getting from your kafka topic) make use of this online converters helps you to convert your json to Java objects. [ http://pojo.sodhanalibrary.com/][1]
从您的 kafka 主题收到消息后,您可以使用 objectmapper 将 json 和 map 转换为适当的 DTO 对象。一旦您准备好 object。 您可以使用 object 通过调用 getId()、getBefore() 等来提取所需的字段,
以下是一些帮助您理解的参考代码:
@KafkaListener(topics = "test")
public void listen(String payload) {
logger.info("Message Received from Kafka topic: {}", payload);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DTOObject dtoObject = objectMapper.readValue(payload,DTOObject.class);
logger.info("After Convertion: {}", objectMapper.writeValueAsString(dtoObject));
logger.info("Get Before:{}", dtoObject.getId());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.