Se você ainda não decidiu, eu iria em frente e escreveria esquemas Avro para seus dados. Feito isso, escolher entre arquivos de contêiner Avro e arquivos Parquet é tão simples quanto trocar, por exemplo,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
para
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
O formato Parquet parece ser um pouco mais computacionalmente intensivo no lado da gravação - por exemplo, exigindo RAM para armazenamento em buffer e CPU para solicitar os dados, etc., mas deve reduzir os custos de E / S, armazenamento e transferência, além de ser eficiente lê especialmente com consultas semelhantes a SQL (por exemplo, Hive ou SparkSQL) que abordam apenas uma parte das colunas.
Em um projeto, acabei revertendo de contêineres Parquet para Avro porque o esquema era muito extenso e aninhado (sendo derivado de algumas classes orientadas a objetos razoavelmente hierárquicas) e resultou em milhares de colunas Parquet. Por sua vez, nossos grupos de linhas eram realmente largos e rasos, o que significa que demorou uma eternidade antes que pudéssemos processar um pequeno número de linhas na última coluna de cada grupo.
Ainda não tive muita chance de usar o Parquet para dados mais normalizados / sãos, mas entendo que, se bem usado, permite melhorias significativas de desempenho.