代码之家  ›  专栏  ›  技术社区  ›  tom lurge

Parquet MR AvroParquet Writer-如何将数据转换为Parquet(使用特定映射)

  •  4
  • tom lurge  · 技术社区  · 10 年前

    我正在开发一个工具,将数据从自制格式转换为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

    1 回复  |  直到 10 年前
        1
  •  2
  •   rifaqat    10 年前

    试试AvroParquetWriter。建设者:

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

    谢谢

    推荐文章