Я работаю над инструментом для преобразования данных из доморощенного формата в паркет и 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
Это сработало отлично, спасибо большое! Некоторые дополнения: 'файл' является выходным файлом, а не' obj.getSchema() 'я использовал' Schema.parse (новый файл («schema.avsc») »и сжатие, например, Snappy можно добавить через' .withCompressionCodec (CompressionCodecName.SNAPPY) '. –