Обрабатывать вложенную запись Avro, когда единица равна нулю

У меня есть вопрос о вложенных записях Avro. На самом деле, я конвертирую файл Json в файл Avro.

Файл Json анализируется с использованием Jackson.

Дело в том:

  • схема Avro содержит все возможные поля (включая вложенные), которые может содержать Json, а иногда отсутствует один или несколько вложенных Json.

  • когда Джексон анализирует файл Json, если вложенный Json отсутствует, ссылка на относительный объект Джексона равна нулю.

  • когда я пытаюсь создать запись Avro, я получаю исключение, поскольку вложенная запись Avro не может быть создана из нулевой ссылки.

Мой вопрос заключается в следующем: как обрабатывать пустые вложенные записи? Я использую значение по умолчанию для полей, есть ли что-то подобное для записи? Если нет, кроме создания вложенного Json вручную, если его нет (с пустыми значениями), есть ли другой способ обработки?

BRgds, Эдди.

2 ответа

Я нашел проблему, это было не то, что я объяснил раньше, мой плохой ^^!

На самом деле в Avro существует какая-то ошибка... для краткости я заполнил вложенную запись avro, созданную компоновщиком, и установил все поля:

deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();
deviceInfoBuilder.setModelName(mobtabJsonHit.getMobtabJsonDeviceInfo().getModuleName());
deviceInfoBuilder.setOperatingSystemName(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemName());
deviceInfoBuilder.setOperatingSystemVersion(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemVersion());
deviceInfoBuilder.setType(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceType());
deviceInfoBuilder.setAdId(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceAdId());

Когда информация была недоступна (т. Е. Вложенного Джексона не было), я создал "пустую" вложенную запись Avro и предоставил ее сборщику следующим образом:

private final static MobtabAvroDeviceInfo emptyMobtabAvroDeviceInfo =
new MobtabAvroDeviceInfo(null, null, null, null, null);
deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder(emptyMobtabAvroDeviceInfo);

И тогда я получил следующее исключение:

java.lang.NullPointerException: null of string of fr.mediametrie.internet.pame.meter.avro.MobtabAvroDeviceInfo of fr.mediametrie.internet.pame.meter.avro.MobtabAvroHit

Хотя моя схема Avro допускает "нулевые" значения...

{
    "name": "device_info",
    "type": {
        "type": "record",
        "name": "MobtabAvroDeviceInfo",
        "fields": [
            {
                "name": "model_name",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "operating_system_name",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "operating_system_version",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "type",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "ad_id",
                "type": ["null", "string"],
                "default": null
            }
        ]
    }
}

Чтобы решить эту проблему, я только что создал новый компоновщик без указания "пустой" вложенной записи Avro в параметре:

deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();

В заключение кажется, что я не могу создать "пустое" вложенное Avro, используя значения по умолчанию, и предоставить сборщику, но я должен позволить сборщику построить этот объект, используя значения по умолчанию, указанные в схеме. Странно, но теперь это работает:)

Я, наконец, уловил проблему... Я получил две разные схемы (я публикую только одну в этом сообщении), обе из которых содержат подзапись mobile_web_event ... При создании источников avro подзапись B стерла A и, в качестве второй имеет разные значения по умолчанию, я думал, что это была ошибка в генерации исходного кода avro... ^^!

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