我配置了一个Kafka-Connect作业,以定期查询MySQL表并将消息放在队列中。这些消息的结构是使用Avro架构定义的。我的其中一个专栏的映射出现问题。
该列在我的MySQL模式中定义为tinyint(1),并且我试图将其映射到avro对象中的布尔字段。
{
"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"
}
答案 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
----------------------------------------