Установка значений во вложенном поле в схеме Avro

Я пытаюсь создать данные avro в kafka с помощью GenericData.Record, но получаю следующее исключение:

Исключение в потоке "main" org.apache.avro.AvroRuntimeException: недопустимое поле схемы: emailAddresses.email

Вот моя схема:

{
 "namespace": "com.cloudurable.User",

 "type": "record",

 "name": "User",

 "fields": [

     {"name": "id", "type": "int", "default" : 0},
     {"name": "fname",  "type": "string", "default" : "EMPTY"},
     {"name": "lname",  "type": "string", "default" : "EMPTY"},
     {"name": "phone_number",  "type": "string", "default" : "EMPTY"},
     {"name": "age",  "type": "int", "default" : 0},

     {
      "name": "emailAddresses",
      "type": {
          "type": "record",
          "name": "EmailAddress",
          "fields": [
            {
              "name": "email",
              "type": "string",
              "default" : "EMPTY"
            },
            {
              "name": "address",
              "type": "boolean",
              "default": false
            }
          ]
        }
    }
 ]
}

Мой код Java выглядит следующим образом:

GenericData.Record avroRecord = new GenericData.Record(SchemaRegstryClient.getLatestSchema("test2"));
        System.out.println(avroRecord.getSchema().getFields());
        avroRecord.put("id", i);
        avroRecord.put("fName", "Sumit" + i);
        avroRecord.put("lName", "Gupta " +i);
        avroRecord.put("phone_number", "98911 " +i);
        avroRecord.put("age", i);
        avroRecord.put("emailAddresses.email", "[email protected]");
        avroRecord.put("emailAddresses.address", true);

Кто-нибудь знает, как я могу поместить вложенное значение в запись avro?


person Sumit G    schedule 06.02.2018    source источник


Ответы (1)


Вы не можете устанавливать внутренние значения с помощью '.'. Итак, вам нужно вручную создать внутренний объект (emailAddresses) и установить его как поле записи верхнего уровня.

final GenericData.Record emailAddresses = new GenericData.Record(schema.getField("emailAddresses").schema());
emailAddresses.put("email", "[email protected]");
emailAddresses.put("address", true);
avroRecord.put("emailAddresses", emailAddresses);
person Natalia    schedule 06.02.2018
comment
Спасибо Наталье, работает. Также у вас есть идеи, как мне получить рекорд, который я здесь установил. GenericRecord record = recordInjection.invert (avroRecord._2) .get (); System.out.println (id = + record.get (emailAddresses)); это дает мне структуру json, но я хочу получить индивидуальную запись. - person Sumit G; 07.02.2018
comment
Я получил ответ ((GenericRecord) record.get (emailAddresses)). Get (email) работает здесь. - person Sumit G; 07.02.2018