![](/img/trans.png)
[英]Not in union [“null”,“int”] Avro Format org.apache.avro.UnresolvedUnionException
[英]Apache Avro : UnresolvedUnionException when using union data type
我正在使用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"}
]
}
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);
正如您在上面看到的,學校實例的other
字段包含一個學生對象。 然而,當我編譯我的代碼時,我得到了UnresolvedUnionException 。 它抱怨School
模式的other
字段的聯合數據類型。 看來它無法解決student
我設置為school
在我的Java代碼。 為什么會出現這種異常? 堆棧跟蹤是:
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)
我可能弄錯了,但我認為聯合類型應該只包含一個非默認值:
{
"name": "other",
"type": [
"null",
"Teacher",
"Student"
]
}
應該是:
{
"name": "other",
"type": [
"null",
{
"name": "Visitors",
"symbols": [
"Student",
"Teacher"
],
"type": "enum"
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.