您可以使用Avro反射来获取架构.它的代码就像ReflectData.AllowNull.get().getSchema(CustomClass.class).我有一个示例
Parquet demo代码段.
本质上,自定义Java对象编写器是这样的:
Path dataFile = new Path("/tmp/demo.snappy.parquet");
// Write as Parquet file.
try (ParquetWriter writer = AvroParquetWriter.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代码.