Avro отражения с пользовательским преобразованием - PullRequest
0 голосов
/ 20 апреля 2020

Как объяснено в в этом ответе , мы можем добавить пользовательское преобразование в схему avro. Как мы можем объединить это с отражением?

предположим, что мы сохранили пример из 1 ,

class Java8LocalDateConversion extends Conversion<LocalDate> {
    @Override
    public Class<LocalDate> getConvertedType() {
        return LocalDate.class;
    }

    @Override
    public String getLogicalTypeName() {
        //      v--- reuse the logical type `date`
        return "date";
    }

    @Override
    // convert LocalDate to Integer
    public Integer toInt(LocalDate value, Schema schema, LogicalType type) {
        return (int) value.toEpochDay();
    }

    @Override
    // parse LocalDate from Integer
    public LocalDate fromInt(Integer value, Schema schema, LogicalType type) {
        return LocalDate.ofEpochDay(value);
    }
}

, но мы хотим использовать отражение для сериализации:

class Example {
    LocalDatet;
}

Обычный подход к отражению:

@Test
void testExample() throws IOException {
    Schema schema = ReflectData.get().getSchema(Example.class);

    DatumWriter<Example> datumWriter = new ReflectDatumWriter<>(schema);
    DataFileWriter<Example> dataFileWriter = new DataFileWriter<>(datumWriter);
    dataFileWriter.create(schema, new File("tmp.avro"));

    Example e = new Example();
    e.t = LocalDate.of(2020, 4, 20);
    dataFileWriter.append(e);
    dataFileWriter.close();
}

Как указать в testExample, что следует использовать пользовательское преобразование? (Я не могу обновить свою версию avro, и этот вопрос должен быть более обобщенным c, чем просто типы дат java8).

...