代码之家  ›  专栏  ›  技术社区  ›  sunny

avro 1.8.2日期类型和文字拼花

  •  0
  • sunny  · 技术社区  · 7 年前

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

    无法写入拼花地板。从我看到的一些解决方案中,他们建议迁移到avro1.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)
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   sunny    7 年前

    需要添加逻辑数据类型时间支持

        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();