【问题标题】:How to covert Simple Java POJO to avro schema .avsc file and then to autogenerated avro records to finally push it into Kafka topic?如何将 Simple Java POJO 转换为 avro schema .avsc 文件,然后转换为自动生成的 avro 记录以最终将其推送到 Kafka 主题中?
【发布时间】:2021-08-19 21:06:13
【问题描述】:

我有这样的 Java POJO

class LibraryEvent {
   String name ;
   int id ;
   Book book;
 
}

class Book{
  String name;
  String author ;
}

如何将其转换为 avro 模式,然后以编程方式进行 avro 记录?有没有办法通过使用注释在 out 文件夹中自动生成 avro 模式和类来做到这一点? 我试图避免将模式生成为字符串,然后显式填充 avro 记录。

【问题讨论】:

    标签: java avro avro-tools


    【解决方案1】:

    避免将模式生成为字符串

    您可以使用SchemaBuilder 来避免该问题,并为您提供一种类型安全的方式来以编程方式定义架构。


    如果没有特定的理由开始使用Java(可以通过@AvroEncode注解or ReflectData来完成),那么start with an IDL file会容易得多

    这些 POJO 类的直接翻译如下所示

    protocol EventProtocol {
    
      record Book {
        union {null, string} name;
        union {null, string} author;
      }  
     
      record LibraryEvent {
        union {null, string} name;
        int id;
        union {null, Book} book;
      }
      
    }
    

    然后文档中提到的 Maven 插件将创建这两个类,并将 AVSC 模式嵌入每个类中作为静态字段。

    您仍然需要“显式填充记录”,因为这只是创建类,不调用任何 setter 方法


    如果您仍然反对架构优先,并且如果您将 Kafka 与 Confluent Avro 序列化程序一起使用,他们有一个关于 using reflection 的部分

    【讨论】:

    • 两个查询: - 1. 如果我继续使用 IDL 方法,如何在应用程序启动时转换 idl->avsc->autogenerated pojos 以提高性能。我想避免为每个 kafka 消息转换 idl->POJO。所有 avro idl 都保存在一个单独的包 .2 中。如何在不为消息中的每个字段和值使用 genericRecord.put(field , value) 的情况下将 kafka 消息转换为通用记录?
    • 1) 您是否阅读了提供的链接并查看了 maven 插件定义?当你编译项目时,你会得到 POJO 类,就像我说的,AVSC 包含在这些类中,如果你需要它们(你真的不需要生产到 Kafka)。 IDL 转换仅在项目编译时进行一次,而不是在每个事件的运行时进行。可以使用命名空间注释将它们移动到不同的包中。 2)maven插件创建特定的记录子类,而不是GenericRecord,所以你会使用POJO setter方法
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2018-10-14
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多