java - Apache 阿夫罗 : UnresolvedUnionException when using union data type

标签 java apache avro

我正在使用Apache Avro用于对象序列化。

我有一个用于 School 对象的 Avro 架构:

{"namespace": "com.my.model",
 "type": "record",
 "name": "School",
 "fields": [
     {"name": "sid",  "type": "int"},
     {"name": "size",  "type": "long"},
     {"name": "other", "type": ["null", "Teacher", "Student"]}
   ]
}

如上所示,"other" 字段保存联合数据类型,它可以是 null Teacher 实例或 Student 实例。

教师对象架构:

{"namespace": "com.my.model",
"type": "record",
"name": "Teacher",
    "fields": [
        {"name": "isMale", "type": "boolean"}
    ]
}

学生对象架构:

{"namespace": "com.my.model",
"type": "record",
"name": "Student",
    "fields": [
        {"name": "age", "type": "int"}
    ]
}

我使用 Avro 工具编译了上述架构,Avro 自动为我生成了所有 Java 类。

然后,在我的 java 程序中,我通过以下方式创建 School 实例:

School school = new School();
school.setSid(3);
school.setSize(2000);

//create a student object
Student student = new Student();
student.setAge(18);

//set student into school instance
school.setOther(student);

如上所示,学校实例的 other 字段包含一个学生对象。然而,当我编译代码时,我得到了 UnresolvedUnionException 。它提示 School 架构的 other 字段的联合数据类型。似乎无法解析我在 Java 代码中设置为 schoolstudent 。为什么会出现这个异常呢?堆栈跟踪是:

org.apache.avro.UnresolvedUnionException: Not in union ["null",{"type":"record","name":"Student","namespace":"com.my.model","fields":[{"name":"age","type":"long"}]},{"type":"record","name":"Teacher","namespace":"com.model","fields":[{"name":"isMale","type":"boolean"}]}]: false
    at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:561)
    at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:144)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71)
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
    at org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:131)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:68)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)

最佳答案

我可能会弄错,但我认为 Union 类型应该只包含一个非默认值:

{
    "name": "other",
    "type": [
        "null",
        "Teacher",
        "Student"
    ]
}

应该是:

{
    "name": "other",
    "type": [
        "null",
        {
            "name": "Visitors",
            "symbols": [
                "Student",
                "Teacher"
            ],
            "type": "enum"
        }
    ]
}

关于java - Apache 阿夫罗 : UnresolvedUnionException when using union data type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333389/

相关文章:

java - JPA - @MapKey 和 @EmbeddedId

apache - Liferay-css 中的负载平衡和集群未加载

apache - htaccess 拒绝访问文件,除非从服务器上的特定子文件夹访问

java - 如何使用 Avro (schemaRegistry) 对 Kafka Streams 进行功能测试?

java - android java消费vb.net wcf服务

java - 如何使用 apache httpClient API 将文件 + api key 和其他参数作为单个请求发送?

apache - EC2 上的 SSL 的 Ambari 注册阶段失败

rpc - AVRO 中的数据验证

java - Java 中的关联数组

java - Eclipse Java Debug模式 : how to get actual type of value?