avro架构中的问题..字符串,null

时间:2013-06-13 17:48:51

标签: java stream java-io encoder avro

在此avro架构中

{"type": "record",
"name": "Member",
"fields": [
 {"name": "name", "type": ["string", "null"] },
 {"name": "skill", "type": "string"}
]}

当我尝试为多个记录分配多个值时......

ByteArrayOutputStream bos=new ByteArrayOutputStream();
Encoder e= EncoderFactory.get().binaryEncoder(bos, null);
GenericRecord rec=new GenericData.Record(schema);
GenericDatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);

for(int i=0;i<memlist.size();i++)
{
   rec.put("name", memlist.get(i).name);
   rec.put("skill", memlist.get(i).skill);
   datumWriter.write(rec, e);
}

e.flush();
bos.close();
System.out.println(bos.toString());

它始终为模式中的NAME字段指定Null ...除了我放的第一条记录... 有没有办法我可以使用默认值作为STRING ...如果没有字符串,那么只有它使用模式中提到的null

如上所述,联盟使用JSON数组表示。例如,[“string”,“null”]声明一个可以是字符串或null的模式。

除了命名类型record,fixed和enum之外,联合可能不包含多个具有相同类型的模式。例如,不允许包含两种数组类型或两种映射类型的联合,但允许使用两种具有不同名称的类型。 (名称允许在阅读和写作联盟时有效解决。)

因此,即使除了第一条记录

之外存在字符串值,它也总是为NULL

1 个答案:

答案 0 :(得分:0)

不确定我是否理解你想要的是什么,但为什么不指定名称字段的默认值?

{"type": "record",
 "name": "Member",
 "fields": [
    {"name": "name", "type": ["string", "null"], "default": "unknown" },
    {"name": "skill", "type": "string"}
]}

然后,如果您没有将字段值显式设置为null,则应使用字符串default。