Если вы еще не решили, я напишу схемы Avro для ваших данных. Как только это будет сделано, выбор между файлами-контейнерами Avro и файлами Parquet почти так же прост, как замена, например,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
за
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
Формат Parquet действительно кажется немного более вычислительно интенсивным на стороне записи - например, требует RAM для буферизации и CPU для упорядочивания данных и т. Д., Но он должен снизить затраты на ввод-вывод, хранение и передачу, а также сделать для эффективного особенно читается с SQL-подобными (например, Hive или SparkSQL) запросами, которые обращаются только к части столбцов.
В одном проекте мне пришлось вернуться с контейнеров Parquet к контейнерам Avro, потому что схема была слишком обширной и вложенной (производной от некоторых довольно иерархических объектно-ориентированных классов) и привела к тысячам столбцов Parquet. В свою очередь, наши группы строк были действительно широкими и неглубокими, что означало, что потребовалась целая вечность, прежде чем мы смогли обработать небольшое количество строк в последнем столбце каждой группы.
У меня еще не было много шансов использовать Parquet для получения более нормализованных / разумных данных, но я понимаю, что при правильном использовании он позволяет значительно улучшить производительность.