JDBC Sink Connector:如何将字段从Kafka的消息映射到数据库表的列

时间:2019-10-11 05:57:12

标签: mysql apache-kafka confluent-platform

我正在使用Confluent JDBC Sink Connector捕获从Kafka主题到数据库的所有更改。我的消息是没有任何附加架构的JSON格式。例如:

{ "key1": "value1", "key2": 100}

这是我的配置:

name=sink-mysql-1
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
topics=send_1
key.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schemas.enable=false
database.hostname=jdbc:mysql://0.0.0.0:3306/test_tbl
database.user=root
database.password=root
insert.mode=upsert
pk.mode=kafka
auto.create=true
auto.evolve=true

我遇到的问题是:由于旧系统的原因,我无法更改消息格式。所以我的消息是没有模式信息的JSON对象。库是否支持映射字段?例如,在数据库下从字段A到字段B的映射。

谢谢

2 个答案:

答案 0 :(得分:0)

必须对您的数据有一个声明的架构,以使用JDBC Sink。实际上,这意味着您需要:

如果在将数据生成到Kafka时没有该选项,则可以构建一个应用模式的流处理阶段。您可以使用Kafka Streams或KSQL来完成此操作。该输出是一个Kafka主题,然后将其用作Kafka Connect的源。在KSQL中执行此操作的示例为:

-- Declare the schema of the source JSON topic
CREATE STREAM send_1_src (KEY1 VARCHAR, 
                          KEY2 INT) 
  WITH (KAFKA_TOPIC='send_1', 
        VALUE_FORMAT='JSON');

-- Run a continuous query populating the target topic `SEND_1_AVRO` 
-- with the data from `send_1` reserialised into Avro
CREATE STREAM SEND_1_AVRO 
  WITH (VALUE_FORMAT='AVRO') AS 
  SELECT * 
    FROM send_1_src;

  • 要了解有关KSQL see here的更多信息。
  • Kafka Tutorials here中,您可以找到原始Kafka使用者vs Kafka Streams与KSQL的流处理模式的一些很好的例子。

答案 1 :(得分:-1)

还有另一种选择,编写一个使用者拦截器,然后将模式附加到JDBC接收器连接器使用的值之前。

我尝试了,它成功了!