你好,我正在寻找使用我已有的POJO类来编写Parquet文件的API。 我能够使用反射生成Avro模式,然后使用AvroSchemaConverter创建Parquet模式。 但我无法找到将POJO类转换为通用记录(Avro)的方法,否则我就可以使用AvroParquetWriter将POJO类写入parquet文件了。 有什么建议吗?
你好,我正在寻找使用我已有的POJO类来编写Parquet文件的API。 我能够使用反射生成Avro模式,然后使用AvroSchemaConverter创建Parquet模式。 但我无法找到将POJO类转换为通用记录(Avro)的方法,否则我就可以使用AvroParquetWriter将POJO类写入parquet文件了。 有什么建议吗?
private static final Schema avroSchema = ReflectData.AllowNull.get().getSchema(YOURCLASS.class);
private static final ReflectDatumWriter<YOURCLASS> reflectDatumWriter = new ReflectDatumWriter<>(avroSchema);
private static final GenericDatumReader<Object> genericRecordReader = new GenericDatumReader<>(avroSchema);
public GenericRecord toAvroGenericRecord() throws IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
reflectDatumWriter.write(this, EncoderFactory.get().directBinaryEncoder(bytes, null));
return (GenericRecord) genericRecordReader.read(null, DecoderFactory.get().binaryDecoder(bytes.toByteArray(), null));
}
还有一件事:似乎parquet写入器目前对空字段非常严格。在尝试写入parquet之前,请确保您的所有字段都不为空。
我没有找到现成的解决方案,所以我自己实现了一个。这是实现的链接:https://gist.github.com/alexeygrigorev/eab72e40c6051e0163a6693054906d66
简而言之,它做了以下几件事:
GenericRecord
对象