在运行时将 String 转换为正确的 avro 类型

Convert String to the correct avro type at runtime

考虑到我知道架构(这仅在运行时已知),我如何才能 create/update avro 消息具有正确的类型?例如:

  val builder = GenericRecordBuilder(schema)
      builder.set("someKey", "SomeValueAsAString")

如果 someKey 的类型是 Number(avro 中的 Int),这将在编码时失败。我可以考虑的一种方法是将 avro 类型 schema.getField("someKey").schema().type 映射到 java / kotlin 类型并进行转换,尽管我不确定这是否会正常工作。有没有更好的解决方案?谢谢!

Avro 不会将 String 解析为您想要的类型,因此出现了问题。您有义务向 set 方法提供您想要用来填充记录字段的确切对象。我建议只在字段类型上使用 switch 进行转换。

不过,您可以查看是否有任何预先实现的方法可以做到这一点。我没找到。

根据我的发现,有 2 个解决方案:

  1. 您自己处理转换
  2. 使用已经这样做的库。我使用 https://github.com/allegro/json-avro-converter 并将我的 GenericRecord 转换为 JSON。
val converter = JsonAvroConverter()
converter.convertToGenericDataRecord(decodedMessage.toString().toByteArray(), schema)

在我的例子中 decodedMessageGenericRecord