[英]Avro Schema with Kafka, ClassCastException?
我已经为我们发布到Kafka主题的记录创建了一个Avro架构。 我们实际的Kafka记录模式更复杂,但为了简洁起见,我附上了相关部分。 我们在记录中有多个嵌套子类,但由于某种原因,我在尝试发布记录时遇到以下异常(包名称已被遮盖):
java.lang.ClassCastException: aaa.bbb.ccc.ddd.Amount cannot be cast to org.apache.avro.generic.IndexedRecord
class KafkaRecord {
private Amount amount;
class Amount {
String currency;
long value;
}
}
这是我定义的Avro架构的当前子集。
{
"type" : "record",
"name" : "KafkaRecord",
"namespace" : "com.company.department",
"fields" : [ {
"name" : "amount",
"type" : {
"type" : "record",
"name" : "Amount",
"namespace" : "aaa.bbb.ccc.ddd",
"fields" : [ {
"name" : "value",
"type" : "long"
}, {
"name" : "currency",
"type" : "string"
} ]
}
}
}
我们对象的JSON表示(KafkaRecord)看起来像这样:
{
"amount": {
"currency": "GBP",
"value": 12345
}
}
我似乎无法弄清楚为什么Avro不喜欢这个嵌套记录,我宁愿不拆开这些嵌套类,因为它会使JSON记录很难阅读并且难以管理类。
如果有人能够指出我在这里做错了什么就会很棒!
好吧,您不需要编写自己的Java文件。 听起来像你做的那样,错误就像它说的那样 - Amount
类不是IndexedRecord
例如,如果我采用您的架构并运行
java -jar ~/Downloads/avro-tools-1.8.2.jar compile schema KafkaRecord.avsc .
然后看一下这个文件,我们看到它扩展了一些Avro java类。
$ head -n 15 aaa/bbb/ccc/ddd/Amount.java
/**
* Autogenerated by Avro
*
* DO NOT EDIT DIRECTLY
*/
package aaa.bbb.ccc.ddd;
import org.apache.avro.specific.SpecificData;
import org.apache.avro.message.BinaryMessageEncoder;
import org.apache.avro.message.BinaryMessageDecoder;
import org.apache.avro.message.SchemaStore;
@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public class Amount extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
Avro Maven插件指南记录了以编程方式执行此操作的方法。
是的,Avro适用于嵌套记录,我个人喜欢使用IDL来更轻松地创建它们
@namespace("com.company.department")
protocol KafkaEventProtocol {
@namespace("aaa.bbb.ccc.ddd")
record Amount {
string currency;
long value;
}
record KafkaValue {
Amount amount;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.