2016-02-10 1 views
3

Я работаю над инструментом для преобразования данных из доморощенного формата в паркет и JSON (для использования в разных настройках с помощью Spark, Drill и MongoDB) , используя Avro с конкретным отображением в качестве шага. Я должен поддерживать преобразование новых данных на регулярной основе и на клиентских машинах, поэтому я пытаюсь написать свой собственный автономный инструмент для конвертации с помощью коммутатора (Avro | Parquet | JSON) вместо использования Drill или Spark или других инструментов в качестве преобразователей как Возможно, я бы это сделал, если бы это была одноразовая работа. Я основываю все это на Avro, потому что это похоже на самый простой способ получить преобразование в Parquet и JSON под одним капюшоном.Parquet-MR AvroParquetWriter - как преобразовать данные в паркет (с конкретным отображением)

Я использовал конкретное сопоставление для получения прибыли от проверки статического типа, написал IDL, преобразовал его в schema.avsc, сгенерировал классы и настроил преобразование образца с помощью конкретного конструктора, но теперь я застрял в настройке авторов. Все примеры преобразования Avro-Parquet, которые я мог найти, [0] используют AvroParquetWriter с устаревшими сигнатурами (в основном: Path file, Schema schema) и Generic Mapping.

AvroParquetWriter имеет только один NONE-осуждается Конструктора, с этой подписью:

AvroParquetWriter(
    Path file, 
    WriteSupport<T> writeSupport, 
    CompressionCodecName compressionCodecName, 
    int blockSize, 
    int pageSize, 
    boolean enableDictionary, 
    boolean enableValidation, 
    WriterVersion writerVersion, 
    Configuration conf 
) 

Большинство параметров не трудно понять, но WriteSupport<T> writeSupport бросает меня. Я не могу найти никакой дополнительной документации или примера.
Смотря на источник AvroParquetWriter, я вижу GenericData model всплывающее окно несколько раз, но только одна строка, указывающая SpecificData: GenericData model = SpecificData.get();.

Поэтому у меня есть несколько вопросов:

1) Есть ли AvroParquetWriter не поддерживают Avro Specific Mapping? Или это с помощью метода SpecificData.get()? Комментарий «Утилиты для сгенерированных классов Java и интерфейсов». над «SpecificData.class», кажется, предполагает, что, но как именно я должен продолжить?

2) Что происходит в конструкторе AvroParquetWriter, есть ли какой-нибудь пример или какая-то документация?

3) Более конкретно: подпись метода WriteSupport запрашивает «Схему avroSchema» и «Модель GenericData». К чему относится GenericData model? Может быть, я не вижу в лес из-за все дерева здесь ...

Чтобы дать пример того, что я и добиваюсь, мой центральный кусок коды преобразования Avro в настоящее время выглядит следующим образом:

DatumWriter<MyData> avroDatumWriter = new SpecificDatumWriter<>(MyData.class); 
DataFileWriter<MyData> dataFileWriter = new DataFileWriter<>(avroDatumWriter); 
dataFileWriter.create(schema, avroOutput); 

Паркет эквивалент в настоящее время выглядит следующим образом:

AvroParquetWriter<SpecificRecord> parquetWriter = new AvroParquetWriter<>(parquetOutput, schema); 

, но это не более, чем начало и смоделировано примерами, которые я нашел, используя устаревший конструктор, поэтому придется менять в любом случае.

Спасибо,
Томас

[0] Hadoop - Окончательный Справочник, O'Reilly, https://gist.github.com/hammer/76996fb8426a0ada233e, http://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter

ответ

1

Попробуйте AvroParquetWriter.builder:

MyData obj = ... // should be avro Object 
ParquetWriter<Object> pw = AvroParquetWriter.builder(file) 
     .withSchema(obj.getSchema()) 
     .build(); 
pw.write(obj); 
pw.close(); 

Спасибо.

+1

Это сработало отлично, спасибо большое! Некоторые дополнения: 'файл' является выходным файлом, а не' obj.getSchema() 'я использовал' Schema.parse (новый файл («schema.avsc») »и сжатие, например, Snappy можно добавить через' .withCompressionCodec (CompressionCodecName.SNAPPY) '. –