Parquet-MR AvroParquetWriter - 如何将数据转换为Parquet(使用特定映射)

时间:2016-02-10 12:58:53

标签: hadoop avro parquet

我正在开发一种工具,用于将数据从本地格式转换为Parquet和JSON(用于Spark,Drill和MongoDB的不同设置),使用Avro with Specific Mapping作为踏脚石。我必须定期支持在客户端机器上转换新数据,这就是为什么我尝试使用(Avro | Parquet | JSON)开关编写自己的独立转换工具而不是使用Drill或Spark或其他工具作为转换器如果这是一次性工作,我可能会这样做。我将整个事情基于Avro,因为这似乎是在一个引擎盖下转换为Parquet和JSON的最简单方法。

我使用了特定映射来从静态类型检查中获利,编写了一个IDL,将其转换为schema.avsc,生成了类并使用特定的构造函数设置了一个示例转换,但现在我无法配置编写器。我找到的所有Avro-Parquet转换示例[0]都使用AvroParquetWriter和不推荐的签名(主要是:Path file, Schema schema)和Generic Mapping。

AvroParquetWriter只有一个不推荐使用的构造函数,具有以下签名:

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弹出几次,但只有一行提到SpecificDataGenericData model = SpecificData.get();

所以我有几个问题:

1)AvroParquetWriter不支持Avro特定映射吗?或者通过SpecificData.get()方法做到了吗?注释“生成的Java类和接口的实用程序”。在'SpecificData.class`似乎表明了这一点,但我究竟应该如何进行?

2)AvroParquetWriter构造函数中发生了什么,是否有一个示例或某些文档可以找到?

3)更具体地说:WriteSupport方法的签名要求'Schema avroSchema'和'GenericData model'。 GenericData model指的是什么?也许我没有看到森林因为这里的所有树木......

为了举例说明我的目标,我的Avro转换代码的核心部分目前看起来像这样:

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

Parquet等效物目前如下:

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

但这只是一个开头,并且是在我找到的示例之后使用不推荐使用的构造函数建模的,因此无论如何都必须进行更改。

谢谢,
托马斯

[0] Hadoop - 权威指南,O'Reilly,https://gist.github.com/hammer/76996fb8426a0ada233ehttp://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter

1 个答案:

答案 0 :(得分:2)

尝试AvroParquetWriter.builder:

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

感谢。

相关问题