web-dev-qa-db-fra.com

Générer un schéma Avro à partir de certains objets Java

Apache Avro fournit un format de données binaire compact, rapide et une structure de données riche pour la sérialisation. Cependant, il nécessite que l'utilisateur définisse un schéma (en JSON) pour l'objet qui doit être sérialisé.

Dans certains cas, cela ne peut pas être possible (par exemple: la classe de cet objet Java possède certains membres dont les types sont externes Java dans les bibliothèques externes). Par conséquent, je me demande si un outil peut obtenir les informations du fichier .class de l'objet et générer le schéma Avro pour cet objet (comme Gson utilise les informations .class de l'objet pour convertir certains objets en chaîne JSON).

20
Richard Le

Jetez un œil à = Java API de réflexion .

Obtenir un schéma ressemble à ceci:

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

Voir le exemple de Doug sur une autre question pour un exemple de travail .

Les crédits de cette réponse appartiennent à Sean Busby.

22
MoustafaAAtta

Voici comment générer un schéma Avro à partir d'une définition POJO

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);
5
charlb

** Exemple**

Classe Pojo

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

Sérialiser

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

Désérialiser

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
}
0
abasar