java - 将自定义 Java 对象写入 Parquet

标签 java hadoop hdfs parquet

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

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

看到这个herehere ,看来我将不得不编写自定义 WriterSupport 来完成此操作。

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

最佳答案

您可以使用 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);
        }
    }

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

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

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

关于java - 将自定义 Java 对象写入 Parquet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35200988/

相关文章:

java - 共享OpenGL资源: delete with finalize() or implement reference counting?

java - Camel |需要调度控制台

hadoop - 使用 'merge' 加入 PIG

apache-spark - 如何使用 spark-csv 包在 HDFS 上仅读取 n 行大型 CSV 文件?

java - NullPointerException 解析 Jsoup

java - 在有或没有泛型感知编译器的情况下编译使用 Class.isAssignableFrom() 的代码

java - 从 HDFS 复制多个文件到本地 : Multithreading?

hadoop - 我可以在hdp 2.6中的 hive 1.2.1000中使用搭接功能吗?

hadoop - NLineInputFormat 无效

hadoop - Apache 星火RDD