Wenn Sie sich noch nicht entschieden haben, würde ich Avro-Schemas für Ihre Daten schreiben. Sobald dies erledigt ist, ist die Auswahl zwischen Avro-Containerdateien und Parkettdateien ungefähr so einfach wie das Austauschen, z.
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
zum
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
Das Parkettformat scheint auf der Schreibseite etwas rechenintensiver zu sein - z. B. RAM zum Puffern und CPU zum Bestellen der Daten usw. erforderlich, aber es sollte die E / A-, Speicher- und Übertragungskosten reduzieren sowie für Effizienz sorgen Liest insbesondere bei SQL-ähnlichen Abfragen (z. B. Hive oder SparkSQL), die nur einen Teil der Spalten adressieren.
In einem Projekt kehrte ich von Parkett zu Avro-Containern zurück, weil das Schema zu umfangreich und verschachtelt war (abgeleitet von einigen ziemlich hierarchischen objektorientierten Klassen) und zu Tausenden von Parkettspalten führte. Unsere Zeilengruppen waren wiederum sehr breit und flach, was bedeutete, dass es ewig dauerte, bis wir eine kleine Anzahl von Zeilen in der letzten Spalte jeder Gruppe verarbeiten konnten.
Ich hatte noch keine große Chance, Parkett für normalisierte / vernünftige Daten zu verwenden, aber ich verstehe, dass es bei guter Verwendung erhebliche Leistungsverbesserungen ermöglicht.