我有一些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
}
答案 0 :(得分:0)
我尝试使用Avro 1.8.2,当我将一个json字符串读入GenericRecord时,它仍然抛出此异常:
org.apache.avro.AvroTypeException: Expected field name not found:
但是两年前我看到一些正确使用别名的示例:
所以我想Avro最近改变了这种行为
答案 1 :(得分:-1)
似乎架构在阅读时只有这种灵活性。 编写AVRO只会查看当前字段名称。
不仅如此,而且我在字段名称(json)中使用“ /” ,不支持作为字段名称。
模式验证在别名中时不会抱怨,因此可能有效(尚未测试)