Si aún no lo ha decidido, seguiré adelante y escribiré esquemas Avro para sus datos. Una vez hecho esto, elegir entre archivos contenedor Avro y archivos Parquet es tan simple como cambiar, por ejemplo,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
para
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
El formato Parquet parece ser un poco más intensivo computacionalmente en el lado de la escritura, por ejemplo, requiere RAM para el almacenamiento en búfer y CPU para ordenar los datos, etc., pero debería reducir los costos de E / S, almacenamiento y transferencia, además de ser eficiente. lee especialmente con consultas similares a SQL (por ejemplo, Hive o SparkSQL) que solo abordan una parte de las columnas.
En un proyecto, terminé volviendo de los contenedores de Parquet a Avro porque el esquema era demasiado extenso y anidado (derivado de algunas clases orientadas a objetos bastante jerárquicas) y resultó en miles de columnas de Parquet. A su vez, nuestros grupos de filas eran realmente anchos y poco profundos, lo que significaba que nos tomó una eternidad antes de que pudiéramos procesar una pequeña cantidad de filas en la última columna de cada grupo.
No he tenido muchas oportunidades de usar Parquet para datos más normalizados / cuerdos todavía, pero entiendo que si se usa bien, permite mejoras significativas en el rendimiento.