parquet mr avroparquetwriter-如何将数据转换为parquet(具有特定Map)

niknxzdl  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(413)

我正在开发一个工具,用于将数据从自制格式转换为parquet和json(用于spark、drill和mongodb的不同设置),使用avro和特定Map作为跳板。我必须定期在客户机上支持新数据的转换,这就是为什么我尝试使用(avro | parquet | json)开关编写自己的独立转换工具,而不是像我可能会做的那样使用drill或spark或其他工具作为转换器。我把整个事情建立在avro的基础上,因为这似乎是在一个引擎盖下转换为parquet和json的最简单的方法。
我使用特定的Map从静态类型检查中获益,编写了一个idl,将其转换为schema.avsc,生成了类,并用特定的构造函数设置了一个示例转换,但现在我仍然无法配置编写器。我能找到的所有avro parquet 转换示例[0]都使用带有不推荐签名的avroparquetwriter(主要是: Path file, Schema schema )和泛型Map。
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 弹出几次,但只有一行提到 SpecificData : GenericData model = SpecificData.get(); .
所以我有几个问题:
1) avroparquetwriter不支持特定于avro的Map吗?或者是通过这个 SpecificData.get() 方法?“specificdata.class”上面的注解“utilities for generated java class and Interface.”似乎暗示了这一点,但我究竟应该如何进行呢?
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/76996fb8426a0ada233e, http://www.programcreek.com/java-api-example/index.php?api=parquet.avro.avroparquetwriter

gzszwxb4

gzszwxb41#

请尝试avroparquetwriter.builder:

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

谢谢。

相关问题