我有一些自定义 java 对象(内部由其他自定义对象组成)。我希望将这些以 Parquet 格式写入 HDFS。
即使经过大量搜索,大多数建议似乎都是围绕使用 avro 格式和 parquet 的内部 AvroConverter 来存储对象。
看到这个here和 here ,看来我将不得不编写自定义 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/