我有一些自定义java对象(内部由其他自定义对象组成)。我希望以镶木地板格式将这些内容写入HDFS。
即使经过大量搜索,大多数建议似乎都是使用avro格式和镶木地板中的内部AvroConverter来存储对象。
看到这个here和here,似乎我必须编写一个自定义的WriterSupport来完成此任务。
有更好的方法吗?哪个更优,直接编写自定义对象或使用Avro等中间模式定义?
答案 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这个代码的启发。