【问题标题】:Apache Avro : UnresolvedUnionException when using union data typeApache Avro:使用联合数据类型时出现 UnresolvedUnionException
【发布时间】:2013-12-02 16:44:46
【问题描述】:

我正在使用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 实例。

Teacher 对象架构:

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

Student 对象架构:

{"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);

正如您在上面看到的,学校实例的@​​987654332@ 字段包含一个学生对象。然而,当我编译我的代码时,我得到了 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)

【问题讨论】:

    标签: java apache avro


    【解决方案1】:

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

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

    应该是:

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

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2017-01-07
      • 2017-09-10
      • 2022-11-04
      • 1970-01-01
      • 2023-01-26
      • 2016-08-12
      • 2020-02-09
      • 2023-01-04
      相关资源
      最近更新 更多