【发布时间】:2021-09-23 16:20:37
【问题描述】:
在 Avro IDL 中,我有一条消息记录定义如下:
record Message{
MessageId id;
array<string> dataField;
}
我在另一个带有空联合的记录中使用这条记录:
record Invoice{
...
union {null,array<Message>} message;
}
我们有一个 Java Kafka 消费者(我们正在使用 Confluent 平台),它使用 avro-maven-plugin 版本 1.10.2,配置为 <stringType>String</stringType>
当我们拨打这样的电话时:
List<String> msgList = message.getDataField();
for (String msg : msgList) {...}
我们在第二行收到以下错误:class org.apache.avro.util.Utf8 cannot be cast to class java.lang.String
以前,Invoice 对象被定义为:
record Invoice{
...
array<Message> message;
}
我们没有收到此错误。我们发现在我们的架构文件中,从
"name" : "dataField",
"type" : {
"type" : "array",
"items" : "string"
}
到
"name" : "dataField",
"type" : {
"type" : "array",
"items" :{
"type": "string",
"avro.java.string" : "String"
}
}
纠正问题。
我不清楚为什么添加联合会导致这种行为变化。我应该使用avro.java.string 声明架构中的所有字符串吗?如果是,我该如何使用 Avro IDL 来做到这一点?
【问题讨论】:
-
我确实找到了似乎与此相关的an open Avro bug。
-
我创建了一个 ASF JIRA bug,与无法通过 Avro IDL 创建
avro.java.string条目有关。
标签: java avro confluent-platform avro-tools