Якщо ви ще не вирішили, я піду і напишу схеми Avro для ваших даних. Після цього вибір між файлами контейнерів Avro та файлами паркету буде настільки ж простим, як і обмін, наприклад,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
для
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
Формат Parquet, здається, дещо обчислювально більший на стороні запису - наприклад, вимагає оперативної пам’яті для буферизації та процесора для впорядкування даних тощо, але він повинен зменшити витрати на введення-виведення, зберігання та передачу, а також забезпечити ефективність читає особливо з SQL-подібними (наприклад, Hive або SparkSQL) запитами, які адресують лише частину стовпців.
В одному проекті я в підсумку повернувся з паркету на контейнери Avro, оскільки схема була занадто обширна і вкладена (похідна з деяких досить ієрархічних об’єктно-орієнтованих класів) і призвела до 1000 стовпців паркету. У свою чергу, наші групи рядків були дійсно широкими та дрібними, що означало, що знадобилося вічно, перш ніж ми змогли обробити невелику кількість рядків в останньому стовпці кожної групи.
У мене ще не було великих шансів використовувати Parquet для більш нормалізованих / розумних даних, але я розумію, що якщо він використовується добре, це дозволяє значно покращити продуктивність.