将自定义java对象写入parquet

dgjrabp2  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

我有一些自定义java对象(内部由其他自定义对象组成)。我想写这些Parquet格式的hdfs。
即使经过大量搜索,大多数建议似乎都是围绕着使用avro格式和内部avroconverter从Parquet来存储对象。
看到这里和这里,似乎我将不得不写一个自定义的writersupport来实现这一点。
有没有更好的办法?直接编写自定义对象或使用avro之类的东西作为中间模式定义,哪一种更为理想?

aor9mmx1

aor9mmx11#

您可以使用avro反射来获取模式。代码是这样的 ReflectData.AllowNull.get().getSchema(CustomClass.class) . 我有一个示例Parquet演示代码片段。
基本上,自定义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);
        }
    }

你可以替换 Team 使用自定义java类。你可以看到 Team 类包括 Person 对象,这与您的要求类似。avro可以毫无问题地得到模式。
如果要写入hdfs,可能需要用hdfs格式替换路径。但我没有亲自尝试。
顺便说一句,我的代码的灵感来自这个Parquet地板的例子代码。

相关问题