我正在开发一个工具,用于将数据从自制格式转换为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
1条答案
按热度按时间gzszwxb41#
请尝试avroparquetwriter.builder:
谢谢。