Kafka-Connect JDBC连接器tinyint到布尔映射

时间:2019-07-02 11:00:04

标签: mysql jdbc avro apache-kafka-connect ksql

我配置了一个Kafka-Connect作业,以定期查询MySQL表并将消息放在队列中。这些消息的结构是使用Avro架构定义的。我的其中一个专栏的映射出现问题。

该列在我的MySQL模式中定义为tinyint(1),并且我试图将其映射到avro对象中的布尔字段。

enter image description here

{ "name": "is_active", "type": "boolean" }

kafka-connect作业运行,消息放入队列,但是当我从队列中读取的应用程序尝试反序列化消息时,出现以下错误:

org.apache.avro.AvroTypeException: Found int, expecting boolean

我希望可以将1或0值自动映射到布尔值,但事实并非如此。

我还尝试将作业配置为使用“转换”转换,但这似乎导致消息中的其他字段出现问题。

"transforms": "Cast", "transforms.Cast.type": "org.apache.kafka.connect.transforms.Cast$Value", "transforms.Cast.spec": "is_active:boolean"

是我所尝试的,还是我必须更改应用程序以使用int值?

这是我的完整配置(我删除了其他一些不相关的字段)

Kafka Connect作业配置

{ "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector", "mode": "bulk", "topic.prefix": "my_topic-name", "transforms.SetSchemaMetadata.type": "org.apache.kafka.connect.transforms.SetSchemaMetadata$Value", "query": "select is_active from my_table", "poll.interval.ms": "30000", "transforms": "SetSchemaMetadata", "name": "job_name", "connection.url": "connectiondetailshere", "transforms.SetSchemaMetadata.schema.name": "com.my.model.name" }

AVRO架构

{ "type": "record", "name": "name", "namespace": "com.my.model", "fields": [
{ "name": "is_active", "type": "long" } ], "connect.name": "com.my.model.name" }

1 个答案:

答案 0 :(得分:0)

您可以使用custom Transform(这是一个完美的用例)来执行此操作,也可以编写一个简单的流应用程序来执行此操作,例如在KSQL中:

CREATE STREAM my_topic AS 
  SELECT COL1, COL2, …
         CASE WHEN is_active=1 THEN TRUE ELSE FALSE AS is_active_bln
  FROM my_source_connect_topic;
ksql> describe my_topic;

Name                 : my_topic
 Field         | Type
-----------------------------------------
 ROWTIME       | BIGINT           (system)
 ROWKEY        | VARCHAR(STRING)  (system)
 COL1          | INTEGER
 COL1          | VARCHAR
 IS_ACTIVE_BLN | BOOLEAN
----------------------------------------