Search code examples
scalaavro

Avro Generic Record not taking aliases into account


I have some JsonData (fastxml.jackson objects) and I want to convert this into a GenericAvro Record. As I don't know by forehand what data I will be getting, only that there is an Avro schema available in a schema repository. I can't have predefined classes. So hence the generic record.

When I pretty print my schema, I can see my keys/values and their aliases. However the Generic record "put" method does not seem to know these aliases.

I get the following exception Exception in thread "main" org.apache.avro.AvroRuntimeException: Not a valid schema field: device/id

Is this by design? How can I make this schema look at the aliases as well?

schema extract:

"fields" : [ {
 "name" : "device_id",
 "type" : "long",
 "doc" : " The id of the device.",
 "aliases" : [ "deviceid", "device/id" ]
}, {
    ............

}]

code:

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

}

Solution

  • It seems like the schema is only this flexible when reading. Writing AVRO only looks at the current field name.

    Not only that, but I'm using "/" in my field names (json), this is not supported as a field name.

    Schema validation does not complain when it's in the alias, so that might work (haven't tested this)