当前位置: 首页 > 知识库问答 >
问题:

如何在Avro中为兼容的模式从GenericRecord转换为专用记录

卫弘图
2023-03-14

Avro SpecificRecord(即生成的java类)是否与模式演化兼容?一、 e.如果我有一个Avro消息源(在我的例子中是Kafka),并且我想将这些消息反序列化为特定的记录,那么这样做是否安全?

我所看到的:

  • 将字段添加到架构的末尾效果很好-可以将ok反序列化为specificrecord
  • 在中间添加字段不会破坏现有客户机

即使消息兼容,这也是一个问题。

如果我能找到新的模式(例如使用合流模式注册表),我可以反序列化到GenericRecord,但似乎没有办法从GenericRecord映射到不同模式的特定记录。

MySpecificType message = (T SpecificData.get().deepCopy(MySpecificType.SCHEMA$, genericMessage);

在很多地方都提到了DeepCoping,但它使用html" target="_blank">索引,所以不起作用。

当您有两个模式并且它们兼容时,是否有任何安全的方法可以在两个avro对象之间进行映射?即使我可以从Generc记录映射到Generic记录,这也可以像我可以完成深度复制技巧一样完成工作。

共有2个答案

慎懿轩
2023-03-14

默认情况下,Kafkaavroderializerconfig。SPECIFIC\u AVRO\u READER\u CONFIG设置为false,因此默认情况下,Kafkaavroderializer将生成GenericData$记录,而不是所需的对象(AVRO生成的类)。

正如@JARC所说,您可以以编程方式启用它。

如果您在Spring Boot项目中使用它,请按以下方式设置:

spring.kafka.consumer.value-deserializer=io.confluent.kafka.serializers.KafkaAvroDeserializer
spring.kafka.consumer.properties.specific.avro.reader=true
董建德
2023-03-14

这里有一些特定数据类型转换的示例测试。全部都在配置“specificDeserializerProps”中

https://github.com/confluentinc/schema-registry/blob/master/avro-serializer/src/test/java/io/confluent/kafka/serializers/KafkaAvroSerializerTest.java

我添加了以下配置,并根据需要获得了特定的类型。

HashMap<String, String> specificDeserializerProps = new HashMap<String, String>();
specificDeserializerProps.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "bogus");
specificDeserializerProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
specificAvroDeserializer = new KafkaAvroDeserializer(schemaRegistry, specificDeserializerProps);

希望有帮助

 类似资料:
  • 问题内容: 我有一个代码可以使用功能将我的avro记录转换为Row 此功能不适用于嵌套模式。 谁能建议我如何将复杂的架构转换为ROW? 问题答案: 有,但是不幸的是私人的。有一些PR可以将其公开,但是它们从未合并: https://github.com/databricks/spark-avro/pull/89 https://github.com/databricks/spark-avro/pu

  • 我为简单的类层次结构自动生成了Avro模式: 看起来是这样的: 此模式适用于使用普通Avro API将数据从JSON读取到。我尝试实现的下一件事是使用将所有此类对象存储到单个拼花文件中: 此代码在第一行失败 难怪AvroSchemaConverter包含以下代码行: 我的模式类型是UNION。非常感谢将此UNION模式映射(合并)到RECORD模式或任何其他建议的任何想法/帮助。 解决方案 1)使

  • 如何使用用户指定的架构将dataframe转换为Avro格式?

  • 有一个网站这样做,但我想要一个图书馆或CLI。 谢了!

  • 鉴于我有一个有效的avro模式,如下所示: } 和Json数组,如下所示: ] 将json数组转换为Avro GenericRecord列表的最佳有效方法是什么? 我有以下代码,将一个json对象转换为一个GenericRecord

  • 我用Avro(序列化器和反序列化器)收到Kafka主题的推文。然后,我创建了一个spark consumer,它在RDD[GenericRecord]的数据流中提取推文。现在,我想将每个rdd转换为数据帧,通过SQL分析这些推文。有什么解决方案可以将RDD[GenericRecord]转换为数据帧吗?