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:

Но я видел, как некоторые образцы использовали псевдоним правильно два года назад:

https://www.waitingforcode.com/apache-avro/serialization-and-deserialization-with-schemas-in-apache-avro/read

Так что, думаю, Авро недавно изменил это поведение.

Кажется, что схема очень гибкая при чтении. Написание AVRO только смотрит на текущее имя поля.

Кроме того, я использую "/" в именах полей (json), это не поддерживается в качестве имени поля.

Проверка схемы не выдает жалоб, когда она находится в псевдониме, так что это может сработать (не проверял это)

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