avro模式中的问题.字符串,null



在此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());

它总是为schema中的NAME字段分配Null…除了我放的第一张唱片是否有一种方法,我可以使用默认字符串…如果没有字符串则只使用模式

中提到的null如上所述,

union使用JSON数组表示。例如,["string", "null"]声明的模式可以是字符串,也可以是null。

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

所以它总是取NULL即使存在字符串值除了第一个记录

不确定我是否正确理解了您想要的内容,但是为什么不为name字段指定一个默认值呢?

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

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

相关内容

  • 没有找到相关文章

最新更新