Я читаю сообщения Avro из потока и записываю их в файл Parquet с помощью parquet.hadoop.ParquetWriter. Я пытаюсь увеличить размер выходных файлов выше порогового значения. проблема в том, что ParquetWriter хранит все в памяти и записывает это на диск только в конце, когда модуль записи закрыт. Согласно документации Parquet, данные записываются в объект памяти в окончательном формате, что означает, что размер объекта в памяти совпадает с окончательным размером на диске. У меня вопрос, как получить размер записанных данных в памяти, чтобы принять решение о закрытии писателя?
Я попытался использовать размер байта сообщений avro, которые я пишу в ParquetWriter, в качестве оценки размера файла Parquet writer, но он сильно отличается от размера parquet writer из-за другого способа хранения данных parquet (столбчатый формат). Вот псевдокод того, что я сделал:
ParquetWriter parquetWriter = new ParquetWriter(..., BLOCK_SIZE, PAGE_SIZE);
long bytesWrittenSofar = 0;
public long getLength(){
return bytesWrittenSofar;
}
public void write(org.apache.avro.generic.GenericRecord record){
parquetWriter.write(record);
bytesWrittenSofar += avroToBytes(record).length;
}
public static byte[] avroToBytes(GenericRecord record){
GenericDatumWriter<GenericRecord> writer =
new GenericDatumWriter<GenericRecord>(record.getSchema());
ByteArrayOutputStream out = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
writer.write(record, encoder);
encoder.flush();
out.close();
return out.toByteArray();
}
Оказалось, что значение, которое я получаю от getLength (), сильно отличается от фактического размера файла parquet. Я знаю, что схема будет добавлена в конец файла, но это очень мало. Чтобы дать вам представление, когда getLength () сообщает о 130 МБ, фактический размер файла составляет всего 80 МБ.