我正在开发一个工具,将数据从自制格式转换为Parquet和JSON(用于Spark、Drill和MongoDB的不同设置),使用Avro和Specific Mapping作为垫脚石。我必须支持定期在客户端机器上转换新数据,这就是为什么我尝试使用(Avro|Parquet|JSON)开关编写自己的独立转换工具,而不是像我可能会使用的那样,使用Drill或Spark或其他工具作为转换器,如果这是一次性工作的话。我是基于Avro的,因为这似乎是在一个引擎盖下转换为Parquet和JSON的最简单方法。
我使用SpecificMapping从静态类型检查中获益,编写了IDL,并将其转换为模式。avsc生成了类,并用特定的构造函数设置了一个示例转换,但现在我不得不配置编写器。我能找到的所有AvroParquet转换示例[0]都使用AvroParketWriter和不推荐的签名(主要是:
Path file, Schema schema
)和通用映射。
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特定映射?或者是这样做的
SpecificData.get()
方法注释“生成的Java类和接口的实用程序”。课堂似乎暗示了这一点,但我到底该怎么做呢?
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