hadoop – Parquet-MR AvroParquetWriter – 如何将数据转换为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文件,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模型弹出了几次,但只有一行提到了SpecificData:GenericData model = SpecificData.get();.

所以我有几个问题:

1)AvroParquetWriter不支持Avro特定映射吗?或者通过SpecificData.get()方法吗?注释“生成的Java类和接口的实用程序”.超过’SpecificData.class`似乎暗示但我该怎么办呢?

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

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

为了举例说明我的目标,我的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/76996fb8426a0ada233e,http://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter

最佳答案 试试AvroParquetWriter.builder:

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

谢谢.

点赞