【问题标题】:Parquet-MR AvroParquetWriter - how to convert data to Parquet (with Specific Mapping)Parquet-MR AvroParquetWriter - 如何将数据转换为 Parquet(带有特定映射)
【发布时间】:2016-02-10 12:58:53
【问题描述】:

我正在开发一种工具,用于将数据从本地格式转换为 Parquet 和 JSON(用于 Spark、Drill 和 MongoDB 的不同设置),使用带有特定映射的 Avro 作为垫脚石。我必须支持定期在客户端机器上转换新数据,这就是为什么我尝试使用 (Avro|Parquet|JSON) 开关编写自己的独立转换工具,而不是使用 Drill 或 Spark 或其他工具作为转换器如果这是一次性工作,我可能会。我将整个事情都基于 Avro,因为这似乎是在一个引擎盖下转换为 Parquet 和 JSON 的最简单方法。

我使用特定映射从静态类型检查中获利,编写了一个 IDL,将其转换为 schema.avsc,生成类并使用特定构造函数设置示例转换,但现在我无法配置编写器。我能找到的所有 Avro-Parquet 转换示例 [0] 都使用带有不推荐使用的签名(主要是:Path file, Schema schema)和通用映射的 AvroParquetWriter。

AvroParquetWriter 只有一个未弃用的构造函数,具有以下签名:

AvroParquetWriter(
    Path file, 
    WriteSupport<T> writeSupport,
    CompressionCodecName compressionCodecName,
    int blockSize, 
    int pageSize, 
    boolean enableDictionary,
    boolean enableValidation, 
    WriterVersion writerVersion,
    Configuration conf
)

大多数参数并不难弄清楚,但WriteSupport&lt;T&gt; writeSupport 让我很反感。我找不到任何进一步的文档或示例。
盯着 AvroParquetWriter 的源代码,我看到 GenericData model 弹出了几次,但只有一行提到 SpecificData: GenericData model = SpecificData.get();

所以我有几个问题:

1) AvroParquetWriter 不支持 Avro 特定映射吗?还是通过SpecificData.get() 方法实现的?注释“生成的 Java 类和接口的实用程序”。 over '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/76996fb8426a0ada233ehttp://www.programcreek.com/java-api-example/index.php?api=parquet.avro.AvroParquetWriter

【问题讨论】:

    标签: hadoop avro parquet


    【解决方案1】:

    试试 AvroParquetWriter.builder :

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

    谢谢。

    【讨论】:

    • 效果很好,非常感谢!一些补充:file是输出文件,而不是obj.getSchema()我使用Schema.parse(new File("schema.avsc")和压缩例如可以通过.withCompressionCodec(CompressionCodecName.SNAPPY)添加Snappy。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多