将自定义 java 对象写入 Parquet

lea*_*pes 4 java hadoop hdfs parquet

我有一些自定义 java 对象(它们内部由其他自定义对象组成)。我希望将这些以 parquet 格式写入 HDFS。

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

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

有一个更好的方法吗?直接编写自定义对象还是使用 Avro 之类的东西作为中间模式定义,哪个更优化?

Hao*_*jin 6

您可以使用 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以将 替换Team为您的自定义 Java 类。您可以看到该类Team包含一个对象列表Person,这与您的要求类似。Avro 可以毫无问题地获取架构。

而如果要写入HDFS,则可能需要将路径替换为HDFS格式。但我个人没有尝试过。

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