从某些Java对象生成Avro架构

Ric*_* Le 22 java serialization jsonschema avro

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

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

Mou*_*tta 24

看一下Java反射API.

获取架构如下所示:

Schema schema = ReflectData.get().getSchema(T);
Run Code Online (Sandbox Code Playgroud)

有关工作示例的另一个问题,请参阅Doug的示例.

这个答案的功劳属于肖恩·巴斯比.


cha*_*rlb 5

这是从POJO定义生成Avro模式的方法

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);
Run Code Online (Sandbox Code Playgroud)


aba*_*sar 5

** 例子**

Pojo 类

public class ExportData implements Serializable {
    private String body;
    // ... getters and setters
}
Run Code Online (Sandbox Code Playgroud)

连载

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();

Run Code Online (Sandbox Code Playgroud)

反序列化

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
}
Run Code Online (Sandbox Code Playgroud)