在此 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。
联合不能包含多个具有相同类型的模式,除了命名类型记录、固定和枚举之外。例如,不允许包含两个数组类型或两个映射类型的联合,但允许两个具有不同名称的类型。 (名称允许在读写联合时进行有效解析。)
因此,即使除了第一条记录之外存在字符串值,它也始终为 NULL
不确定我是否正确理解了您想要的内容,但是为什么不为名称字段指定默认值?
{"type": "record",
"name": "Member",
"fields": [
{"name": "name", "type": ["string", "null"], "default": "unknown" },
{"name": "skill", "type": "string"}
]}
然后,如果您没有显式地将字段值设置为 null,则应使用字符串默认值。