我正在开发一种工具,用于将数据从本地格式转换为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
弹出几次,但只有一行提到SpecificData
:GenericData 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/76996fb8426a0ada233e,http://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter
答案 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();
感谢。