使用Apache的avro-tools包,我已经从我的.avsc类生成了一个.avsc文件。我将ReflectData指向我的主类,并使用它输出模式。这个问题有很多方面,但从根本上说,我的问题是无法创建一个Avro文件,即使模式和数据是由同一个类生成的。
Java中的代码是:Schema x = ReflectData.AllowNull.get().getSchema(MessageEnvelope.class);
因此,我将上面的输出粘贴到一个文件中,并称之为msgEnvelope.avsc。
发生错误的架构文件的行是:
{
"type": "record",
"name": "MessageEnvelope",
"namespace": "data.decoder",
"fields": [
{
"name": "headers",
"type": [
"null",
{
"type": "map",
"values": "string"
}
],
"default": null
},
....
}我的JSON数据中对应于模式的这一部分的部分是:
{"headers": {"idno":"123", "maker":"xyz"}}并且运行avro-tools会产生一个org.apache.avro.AvroTypeException: Unknown union branch idno,目标是允许headers包含一个可变数目的键值对。
为了产生这个错误,我运行了java -jar avro-tools.jar fromjson --schema-file msgEnvelope.avsc tgtJson.json
谢谢你能提供的任何帮助!
发布于 2017-03-13 15:47:28
我认为这一切都是因为json。
下面是一个例子:
Java类:
public class MessageEnvelope {
Map<String, String> headers;
public Map<String, String> getHeaders() {
return headers;
}
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
}Avro模式:
{
"type":"record",
"name":"MessageEnvelope",
"namespace":"data.decoder",
"fields":[{
"name":"headers",
"type":[
"null",
{"type":"map","values":"string"}
],
"default":null
}]
}Json数据:
{
"headers":{
"map":{
"maker":"xyz",
"idno":"123"
}
}
}我和您一样调用java -jar avro-tools-1.8.1.jar fromjson --schema-file msgEnvelope.avsc msgEnvelope.json,没有看到任何异常。
也许你应该试试我用过的那个json?
https://stackoverflow.com/questions/42496640
复制相似问题