Avro with Java 8 dates as logical type

后端 未结 4 1612
北恋
北恋 2020-12-30 02:50

Latest Avro compiler (1.8.2) generates java sources for dates logical types with Joda-Time based implementations. How can I configure Avro compiler to produce sources that u

4条回答
  •  再見小時候
    2020-12-30 03:44

    You need to create your own Conversions to support java-8 date-time api, below is a conversion for java.time.LocalDate:

    class Java8LocalDateConversion extends Conversion {
        @Override
        public Class 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);
        }
    }
    

    The logical types can be reused in avro, so you can using the existing date logical type, for example:

    Schema schema = LogicalTypes.date().addToSchema(Schema.create(Type.INT));
    

    For the serializing & deserializing you should set the GenericData which will find your own conversion, for example:

    //serializing
    DatumWriter out = new SpecificDatumWriter<>(schema, data());
    
    // deserializing
    DatumReader in = new SpecificDatumReader<>(schema, schema, data());
    
    private SpecificData data() {
        SpecificData it = new SpecificData();
        it.addLogicalTypeConversion(new Java8LocalDateConversion());
        return it;
    }
    

    If you don't want to configure the GenericData every time, you can use the global GenericData instead, for example:

    //      register the conversion globally ---v
    SpecificData.get().addLogicalTypeConversion(new Java8LocalDateConversion());
    

提交回复
热议问题