将自定义Java对象编写到Parquet

时间:2016-02-04 12:25:31

标签: java hadoop hdfs parquet

我有一些自定义java对象(内部由其他自定义对象组成)。我希望以镶木地板格式将这些内容写入HDFS。

即使经过大量搜索,大多数建议似乎都是使用avro格式和镶木地板中的内部AvroConverter来存储对象。

看到这个herehere,似乎我必须编写一个自定义的WriterSupport来完成此任务。

有更好的方法吗?哪个更优,直接编写自定义对象或使用Avro等中间模式定义?

1 个答案:

答案 0 :(得分:0)

您可以使用Avro反射来获取架构。该代码类似于ReflectData.AllowNull.get().getSchema(CustomClass.class)。我有一个示例Parquet demo代码段。

基本上,自定义Java对象编写器是这样的:

    Path dataFile = new Path("/tmp/demo.snappy.parquet");

    // Write as Parquet file.
    try (ParquetWriter<Team> writer = AvroParquetWriter.<Team>builder(dataFile)
            .withSchema(ReflectData.AllowNull.get().getSchema(Team.class))
            .withDataModel(ReflectData.get())
            .withConf(new Configuration())
            .withCompressionCodec(SNAPPY)
            .withWriteMode(OVERWRITE)
            .build()) {
        for (Team team : teams) {
            writer.write(team);
        }
    }

您可以使用自定义Java类替换Team。并且您可以看到Team类包含Person对象的列表,这与您的要求类似。而且Avro可以毫无问题地获得架构。

如果要写入HDFS,则可能需要用HDFS格式替换路径。但是我没有亲自尝试。

顺便说一句,我的代码受parquet-example这个代码的启发。