Определение записи переопределения Avro ReflectData для логического типа - PullRequest
0 голосов
/ 31 мая 2019

Я использую ReflectData для генерации схемы из класса Java. Одно из полей

private LocalDate localDate;

и refleData генерирует эквивалентный код в виде записи

   {  
     "name":"localDate",
     "type":[  
        "null",
        {  
           "type":"record",
           "name":"LocalDate",
           "namespace":"java.time",
           "fields":[  

           ]
        }
     ],
     "default":null
  }

Я хотел бы переопределить поведение в классе, используя некоторые операции в схеме ниже, чтобы

 final Schema schema = ReflectData.AllowNull.get().getSchema(cls). ?;

результирующая схема ссылается на дату логического типа, как показано ниже

 {
    "name" : "localDate",
    "type" : [ "null", {
      "type" : "int",
      "logicalType" : "date"
    } ],
    "default" : null
  }

...

Добавлено еще несколько попыток

 // given a java object
 @Data
 public class JavaPojo {


    @AvroEncode(using = DateAsLongEncoding.class)
    private Date javaDate;

    @AvroEncode(using = DateAsLongEncoding.class)
    private LocalDateTime javaLocalDateTime;

 }
 ...
 // and an instance of it
 JavaPojo javaPojo = new JavaPojo();
 javaPojo.setJavaDate(new Date());
 javaPojo.setJavaLocalDateTime(LocalDateTime.now())
...
 // use relfection to generate the schema and eventually store it as parquet with a logicalType mapping
 Schema schema = ReflectData.AllowNull.get().getSchema(JavaPojo.class);
 // attempted to toggle on timeSupport as well
 GenericData timeSupport = new GenericData();
 timeSupport.addLogicalTypeConversion(new TimeConversions.DateConversion());

 ParquetWriter<JavaPojo> avroParquetWriter =  
                        AvroParquetWriter.<JavaPojo> builder(fsPath)
                                                .withSchema(schema)
                                                .withDataModel(ReflectData.get())
.withDataModel(timeSupport)
.withCompressionCodec(ompressionCodecName.SNAPPY)
                                                .build();

...
 // fails with the below when no timeSupport is set
java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.Number
or similarly with LocalDateTime

// fails with the below when timeSupport is added
java.lang.ClassCastException: JavaPojo cannot be cast to org.apache.avro.generic.IndexedRecord



...