Создать схему Avro из определенного объекта Java

Apache Avro предоставляет компактный, быстрый двоичный формат данных с богатой структурой данных для сериализации. Однако для этого требуется, чтобы пользователь определил схему (в JSON) для объекта, который необходимо сериализовать.

В некоторых случаях это может быть невозможно (например, класс этого объекта Java имеет некоторые члены, типы которых являются внешними классами Java во внешних библиотеках). Следовательно, мне интересно, есть ли инструмент, который может получить информацию из файла .class объекта и сгенерировать схему Avro для этого объекта (например, Gson использует информацию объекта .class для преобразования определенного объекта в строку JSON).


person Richard Le    schedule 09.04.2014    source источник
comment
Интересный вопрос. Существует инструмент, который может генерировать схемы JSON из классов Java (jsonschema2pojo), и у меня есть инструмент, который может генерировать схему Avro из схем JSON (json-schema-avro). Однако первый инструмент может генерировать только JSON Schema v3, а мой инструмент awais JSON Schema v4 в качестве входных данных ...   -  person fge    schedule 11.04.2014
comment
Спасибо за ответ. Вы имеете в виду, что вы написали инструмент, который может конвертировать схему Avro из схемы JSON?   -  person Richard Le    schedule 11.04.2014
comment
Да, я имею в виду следующее: github.com/fge/json-schema-avro   -  person fge    schedule 11.04.2014


Ответы (3)


Взгляните на API отражения Java.

Получение схемы выглядит так:

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

См. пример от Дуга по другому вопросу для рабочего примера.

Кредиты на этот ответ принадлежат Шону Басби.

person MoustafaAAtta    schedule 01.07.2014

Вот как можно создать Схема Avro из определения 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);
person charlb    schedule 10.01.2018

** Пример**

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
}
person abasar    schedule 23.04.2019