Если вы еще не решили, я бы пошел и написал схемы Avro для ваших данных. Как только это будет сделано, выбирая между контейнерными файлами Avro и Паркетные файлы примерно так же просто, как замена из, например,
job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());
для
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());
Формат Паркет, похоже, немного более интенсивных вычислений на на стороне записи - например, требуя RAM для буферизации и CPU для заказа данных и т. д., но это должно уменьшить затраты на ввод-вывод, хранение и передачу, а также сделать для эффективного чтения, особенно с SQL-подобными запросами (например, Hive или SparkSQL) что касается только части столбцов.
В одном проекте я закончил возвращаться из Parquet в контейнеры Avro, потому что схема была слишком обширной и вложенной (будучи полученной из некоторых довольно иерархических объектно-ориентированных классов) и привела к 1000 столбцам Паркета. В свою очередь, наши группы строк были очень широкими и неглубокими, что означало, что это потребовалось навсегда, прежде чем мы могли обработать небольшое количество строк в последнем столбце каждой группы.
У меня не было большого шанса использовать паркет для получения более нормализованных/нормальных данных, но я понимаю, что если использовать его хорошо, он позволяет значительно улучшить производительность.
Ожидание сравнения. В настоящее время я выбрал Avro для моего проекта, поскольку у паркета есть проблемы с уловкой :) – Abhishek
@Abshinek, можете ли вы предоставить некоторую информацию о проблемах совместимости с hive и avro –
@EB Не должно быть никаких проблем, если они есть, они будут упомянутый в https://cwiki.apache.org/confluence/display/Hive/AvroSerDe –