Parquet-MR AvroParquetWriter - 如何将数据转换为 Parquet(使用特定映射)
Parquet-MR AvroParquetWriter - how to convert data to Parquet (with Specific Mapping)
我正在开发一种工具,用于将数据从本地格式转换为 Parquet 和 JSON(用于 Spark、Drill 和 MongoDB 的不同设置),使用具有特定映射的 Avro作为敲门砖。我必须支持定期在客户端机器上转换新数据,这就是为什么我尝试使用 (Avro|Parquet|JSON) 开关编写自己的独立转换工具,而不是使用 Drill 或 Spark 或其他如果这是一次性工作,我可能会使用工具作为转换器。我将整个事情都基于 Avro,因为这似乎是在一个引擎盖下转换为 Parquet 和 JSON 的最简单方法。
我使用特定映射从静态类型检查中获益,编写了一个 IDL,将其转换为 schema.avsc,生成了 类 并使用特定构造函数设置了一个示例转换,但现在我'我坚持配置作者。我能找到的所有 Avro-Parquet 转换示例 [0] 使用 AvroParquetWriter 和不推荐使用的签名(主要是:Path file, Schema schema
)和通用映射。
AvroParquetWriter 只有一个 none-已弃用的构造函数,具有此签名:
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()
方法?关于“SpecificData.class”的评论 "Utilities for generated Java classes and interfaces." 似乎暗示了这一点,但我应该如何进行呢?
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
试试 AvroParquetWriter.builder :
MyData obj = ... // should be avro Object
ParquetWriter<Object> pw = AvroParquetWriter.builder(file)
.withSchema(obj.getSchema())
.build();
pw.write(obj);
pw.close();
谢谢。
我正在开发一种工具,用于将数据从本地格式转换为 Parquet 和 JSON(用于 Spark、Drill 和 MongoDB 的不同设置),使用具有特定映射的 Avro作为敲门砖。我必须支持定期在客户端机器上转换新数据,这就是为什么我尝试使用 (Avro|Parquet|JSON) 开关编写自己的独立转换工具,而不是使用 Drill 或 Spark 或其他如果这是一次性工作,我可能会使用工具作为转换器。我将整个事情都基于 Avro,因为这似乎是在一个引擎盖下转换为 Parquet 和 JSON 的最简单方法。
我使用特定映射从静态类型检查中获益,编写了一个 IDL,将其转换为 schema.avsc,生成了 类 并使用特定构造函数设置了一个示例转换,但现在我'我坚持配置作者。我能找到的所有 Avro-Parquet 转换示例 [0] 使用 AvroParquetWriter 和不推荐使用的签名(主要是:Path file, Schema schema
)和通用映射。
AvroParquetWriter 只有一个 none-已弃用的构造函数,具有此签名:
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()
方法?关于“SpecificData.class”的评论 "Utilities for generated Java classes and interfaces." 似乎暗示了这一点,但我应该如何进行呢?
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
试试 AvroParquetWriter.builder :
MyData obj = ... // should be avro Object
ParquetWriter<Object> pw = AvroParquetWriter.builder(file)
.withSchema(obj.getSchema())
.build();
pw.write(obj);
pw.close();
谢谢。