Обрабатывать вложенную запись 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... ^^!