【问题标题】:Generate Avro Schema from certain Java Object从某个 Java 对象生成 Avro Schema
【发布时间】:2014-05-22 04:03:34
【问题描述】:

Apache Avro 为序列化提供了紧凑、快速、二进制数据格式、丰富的数据结构。但是,它需要用户为需要序列化的对象定义一个模式(在 JSON 中)。

在某些情况下,这是不可能的(例如:该 Java 对象的类有一些成员,其类型是外部库中的外部 Java 类)。因此,我想知道有没有一种工具可以从对象的 .class 文件中获取信息并为该对象生成 Avro 模式(例如 Gson 使用对象的 .class 信息将某些对象转换为 JSON 字符串)。

【问题讨论】:

  • 有趣的问题。有一个可以从 Java 类(jsonschema2pojo)生成 JSON 模式的工具,我有一个可以从 JSON 模式(json-schema-avro)生成 Avro 模式的工具。但是,前一个工具只能生成 JSON Schema v3,而我的工具需要 JSON Schema v4 作为输入...
  • 谢谢你的回答,你的意思是你写了一个可以从 JSON 模式转换 Avro 模式的工具?
  • 是的,我的意思是:github.com/fge/json-schema-avro

标签: java serialization avro jsonschema


【解决方案1】:

** 示例**

Pojo类

public class ExportData implements Serializable {
    private String body;
    // ... getters and setters
}

序列化

File file = new File(fileName);
DatumWriter<ExportData> writer = new ReflectDatumWriter<>(ExportData.class);
DataFileWriter<ExportData> dataFileWriter = new DataFileWriter<>(writer);
Schema schema = ReflectData.get().getSchema(ExportData.class);
dataFileWriter.create(schema, file);
for (Row row : resultSet) {
    String rec = row.getString(0);
    dataFileWriter.append(new ExportData(rec));
}
dataFileWriter.close();

反序列化

File file = new File(avroFilePath);
DatumReader<ExportData> datumReader = new ReflectDatumReader<>(ExportData.class);
DataFileReader<ExportData> dataFileReader = new DataFileReader<>(file, datumReader);
ExportData record = null;
while (dataFileReader.hasNext()){
    record = dataFileReader.next(record);
    // process record
}

【讨论】:

  • 这适用于不可为空的列,但我有一些可以为空的字段。有没有办法让这些字段在 Aro 模式中为空。否则它会抛出异常 = org.apache.avro.file.DataFileWriter$AppendWriteException: java.lang.NullPointerException: in models.RawData in double null of double in field offset of models.RawData
【解决方案2】:

这里是Generate an Avro Schema from POJO definition的方法

ObjectMapper mapper = new ObjectMapper(new AvroFactory());
AvroSchemaGenerator gen = new AvroSchemaGenerator();
mapper.acceptJsonFormatVisitor(RootType.class, gen);
AvroSchema schemaWrapper = gen.getGeneratedSchema();
org.apache.avro.Schema avroSchema = schemaWrapper.getAvroSchema();
String asJson = avroSchema.toString(true);

【讨论】:

    【解决方案3】:

    看看the Java reflection API

    获取架构如下所示:

    Schema schema = ReflectData.get().getSchema(T);
    

    请参阅example from Doug on another question for a working example

    此答案的功劳属于 Sean Busby。

    【讨论】:

    • 这适用于不可为空的列,但我有一些可以为空的字段。有没有办法让这些字段在 Aro 模式中为空。否则它会抛出异常 = org.apache.avro.file.DataFileWriter$AppendWriteException: java.lang.NullPointerException: in models.RawData in double null of double in field offset of models.RawData
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多