Проблемы в авро схеме.. Строка, ноль

В этой авро схеме

{"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());

Он всегда назначает поле Null FOR NAME в схеме... за исключением первой записи, которую я поместил... Есть ли способ, которым я могу использовать default как STRING ... и если нет строки, то только она использует упомянутый null в схеме

Объединения, как упоминалось выше, представлены с использованием массивов JSON. Например, ["string", "null"] объявляет схему, которая может быть либо строкой, либо нулем.

Объединения не могут содержать более одной схемы с одним и тем же типом, за исключением именованных типов record, fixed и enum. Например, объединения, содержащие два типа массивов или два типа карт, недопустимы, но разрешены два типа с разными именами. (Имена обеспечивают эффективное разрешение при чтении и написании союзов.)

Поэтому он всегда принимает значение NULL, даже если строковое значение существует, за исключением первой записи.

1 ответ

Не уверен, что я правильно понимаю, что вы хотите, но почему бы вам не указать значение по умолчанию для поля имени?

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

Затем, если вы явно не установите значение поля в null, следует использовать строку default.

Другие вопросы по тегам