我有一些自定义java对象(内部由其他自定义对象组成)。我想写这些Parquet格式的hdfs。即使经过大量搜索,大多数建议似乎都是围绕着使用avro格式和内部avroconverter从Parquet来存储对象。看到这里和这里,似乎我将不得不写一个自定义的writersupport来实现这一点。有没有更好的办法?直接编写自定义对象或使用avro之类的东西作为中间模式定义,哪一种更为理想?
aor9mmx11#
您可以使用avro反射来获取模式。代码是这样的 ReflectData.AllowNull.get().getSchema(CustomClass.class) . 我有一个示例Parquet演示代码片段。基本上,自定义java对象编写器是这样的:
ReflectData.AllowNull.get().getSchema(CustomClass.class)
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地板的例子代码。
Team
Person
1条答案
按热度按时间aor9mmx11#
您可以使用avro反射来获取模式。代码是这样的
ReflectData.AllowNull.get().getSchema(CustomClass.class)
. 我有一个示例Parquet演示代码片段。基本上,自定义java对象编写器是这样的:
你可以替换
Team
使用自定义java类。你可以看到Team
类包括Person
对象,这与您的要求类似。avro可以毫无问题地得到模式。如果要写入hdfs,可能需要用hdfs格式替换路径。但我没有亲自尝试。
顺便说一句,我的代码的灵感来自这个Parquet地板的例子代码。