Проблемы в авро схеме.. Строка, ноль
В этой авро схеме
{"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.