以下是我用于生成Avro类
的架构的相关部分{"namespace": "com.namespace.kafka.event",
"type": "record",
"name": "RecordName",
"fields": [
// some fields declared
...
{"name": "products", "type": { "type": "array", "items":
{
"name": "productInfo",
"type": "record",
"fields" : [
{"name": "productId", "type": "int"},
{"name": "productScore", "type": "float"}
]
}
}
},
// some more fields declared
...
] }
我能够为这个模式生成类并填充它们。因此,基本上在生成中会生成一个名为productInfo的新类,它可以满足我的需求。 (后来我将数据发送给Kafka)。问题是反序列化。我正在使用这样的东西:
GenericData.Array<String> productTuple = (GenericData.Array<String>) record.get("products");
这为GenericData数组的每个元素返回一个字符串(实际上是一个JSON)。
{"productName" : someName, "productScore" : someScore }
我可以解析这个字符串并得到我想要的东西但是还有更多&#34; Avro&#34;这样做的方式。就像我可以将结果再次转换为像这样的GenericRecord对象。
GenericData.Array<GenericRecord> productTuple = (GenericData.Array<GenericRecord>) record.get("products");
或者这可以使用productInfo作为我的avro架构生成的类:
GenericData.Array<productInfo> productTuple = (GenericData.Array<productInfo>)
不幸的是,我无法测试它我没有这么简单的设置。我搜索了整个网络,但找不到办法。任何帮助将不胜感激。
答案 0 :(得分:6)
正确的方法是使用:
GenericData.Array<GenericRecord> productTuple =(GenericData.Array<GenericRecord>) record.get("products");
我相信最后一个可能也可以正常工作但是这个允许我反序列化JSON而不会受到类的任何进一步干扰。