Avro Generic Record не учитывает псевдонимы
У меня есть некоторые JsonData (объекты fastxml.jackson), и я хочу преобразовать это в запись GenericAvro. Поскольку я не знаю заранее, какие данные я буду получать, только то, что в репозитории схемы есть схема Avro. Я не могу иметь предопределенные классы. Поэтому отсюда и общая запись.
Когда я довольно печатаю свою схему, я вижу свои ключи / значения и их псевдонимы. Однако общий метод записи "put", похоже, не знает этих псевдонимов.
Я получаю следующее исключение Exception in thread "main" org.apache.avro.AvroRuntimeException: Not a valid schema field: device/id
Это по замыслу? Как я могу сделать так, чтобы эта схема смотрела на псевдонимы?
извлечение схемы:
"fields" : [ {
"name" : "device_id",
"type" : "long",
"doc" : " The id of the device.",
"aliases" : [ "deviceid", "device/id" ]
}, {
............
}]
код:
def jsonToAvro(jSONObject: JsonNode, schema: Schema): GenericRecord = {
val converter = new JsonAvroConverter
println(jSONObject.toString) // correct
println(schema.toString(true)) // correct
println(schema.getField("device_id")) //correct
println(schema.getField("device_id").aliases()toString) //correct
val avroRecord = new GenericData.Record(schema)
val iter = jSONObject.fields()
while (iter.hasNext) {
import java.util
val e = jSONObject.fields()
val entry = iter.next.asInstanceOf[util.Map.Entry[String, Nothing]]
println(s"adding ${entry.getKey.toString} and ${entry.getValue} with ${entry.getValue.getClass.getName}") // adding device/id and 8711 with com.fasterxml.jackson.databind.node.IntNode
avroRecord.put(entry.getKey.toString, entry.getValue) // throws
}
avroRecord
}
1 ответ
Я пробовал на Avro 1.8.2, он по-прежнему выдает это исключение, когда я читаю строку json в GenericRecord:
org.apache.avro.AvroTypeException: Expected field name not found:
Но я видел, как некоторые образцы использовали псевдоним правильно два года назад:
Так что, думаю, Авро недавно изменил это поведение.
Кажется, что схема очень гибкая при чтении. Написание AVRO только смотрит на текущее имя поля.
Кроме того, я использую "/" в именах полей (json), это не поддерживается в качестве имени поля.
Проверка схемы не выдает жалоб, когда она находится в псевдониме, так что это может сработать (не проверял это)