您可以使用 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代码的启发。