0

在这个 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 即使除了第一条记录之外存在字符串值

4

1 回答 1

0

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

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

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

于 2013-07-25T09:53:24.520 回答