使用联合数据类型时,Apache Avro:UnresolvedUnionException - java

我正在使用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"字段包含联合数据类型,它可以是nullTeacher实例或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字段包含一个Student对象。但是,当我编译代码时,我得到了UnresolvedUnionException。它抱怨other模式的School字段的并集数据类型。似乎无法解析我在Java代码中设置为studentschool。为什么会有这种例外? Stacktrace是:

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-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

如何通过kafka流加入主题 - java

卡夫卡流我正在尝试流式传输,但存在一些问题,它不起作用。首先,我有3个连接器,但不能使用自己的钥匙。我需要钥匙才能加入它们,对不对?如何使用2个或更多钥匙加入?我尝试复制这样的内容: 选择*从(选择a。*从用户a内部联接部门b 在a.dep = b.dep和a.group = b.group上 )a.id = b.id上的内部联接user_afy我想将内部联…

Java-父类正在从子类中调用方法? - java

抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…