тип даты avro 1.8.2 и написание как паркет - PullRequest
0 голосов
/ 02 июня 2019

Я использую avro 1.8.2 и простую запись avro idl, как, например,

record FooRecord {
       string fooString;
       int fooInt;
       union {null, date} fooDate = null;
}

не может быть записано в паркет.Из некоторых решений, которые я видел, они рекомендуют перейти на avro 1.9 (но я, вероятно, не хочу этого делать, потому что большая часть нашего текущего стека использует 1.8.2).

Есть ли способ заставить эту работу работать с avro-1.8.2?

java.lang.ClassCastException: org.joda.time.LocalDate cannot be cast to java.lang.Number
    at org.apache.parquet.avro.AvroWriteSupport.writeValueWithoutConversion(AvroWriteSupport.java:323)
    at org.apache.parquet.avro.AvroWriteSupport.writeValue(AvroWriteSupport.java:275)
    at org.apache.parquet.avro.AvroWriteSupport.writeRecordFields(AvroWriteSupport.java:191)
    at org.apache.parquet.avro.AvroWriteSupport.write(AvroWriteSupport.java:165)
    at org.apache.parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:128)
    at org.apache.parquet.hadoop.ParquetWriter.write(ParquetWriter.java:299)

1 Ответ

0 голосов
/ 04 июня 2019

Необходимо добавить временную поддержку типов логических данных

    GenericData timeSupport = new GenericData();
    // need to add logicalTime Support
    timeSupport.addLogicalTypeConversion(new TimeConversions.DateConversion());
    timeSupport.addLogicalTypeConversion(new TimeConversions.TimeConversion());
    timeSupport.addLogicalTypeConversion(new TimeConversions.TimestampConversion());
    ParquetWriter<GenericRecord> avroParquetWriter = AvroParquetWriter.<GenericRecord> builder(parquetPath)
                                                                      .withSchema(avro.getSchema())
                                                                      .withDataModel(timeSupport)
                                                                      .withCompressionCodec(CompressionCodecName.SNAPPY)
                                                                      .build();
...