将自定义java对象写入拼花地板
我有一些自定义java对象(内部由其他自定义对象组成)。我希望将这些以拼花格式写入HDFS 即使经过大量搜索,大多数建议似乎都是使用avro格式和拼花地板的内部AvroConverter来存储对象 看到这一点,我似乎必须编写一个自定义WriterSupport来实现这一点将自定义java对象写入拼花地板,java,hadoop,hdfs,parquet,Java,Hadoop,Hdfs,Parquet,我有一些自定义java对象(内部由其他自定义对象组成)。我希望将这些以拼花格式写入HDFS 即使经过大量搜索,大多数建议似乎都是使用avro格式和拼花地板的内部AvroConverter来存储对象 看到这一点,我似乎必须编写一个自定义WriterSupport来实现这一点 有更好的方法吗?直接编写自定义对象或使用类似Avro的东西作为中间模式定义,哪个更为理想?您可以使用Avro反射来获取模式。其代码类似于ReflectData.AllowNull.get().getSchema(CustomC
有更好的方法吗?直接编写自定义对象或使用类似Avro的东西作为中间模式定义,哪个更为理想?您可以使用Avro反射来获取模式。其代码类似于
ReflectData.AllowNull.get().getSchema(CustomClass.class)
。我有一个示例代码片段
基本上,自定义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);
}
}
路径数据文件=新路径(“/tmp/demo.snapy.parquet”);
//写为拼花文件。
try(ParquetWriter writer=AvroParquetWriter.builder(数据文件)
.withSchema(ReflectData.AllowNull.get().getSchema(Team.class))
.withDataModel(ReflectData.get())
.withConf(新配置())
.使用压缩编解码器(SNAPPY)
.withWriteMode(覆盖)
.build()){
对于(团队:团队){
写作(团队);
}
}
您可以用自定义Java类替换团队
。您可以看到,Team
类包含一个Person
对象列表,这与您的需求类似。Avro可以毫无问题地获得模式
如果要写入HDFS,可能需要将路径替换为HDFS格式。但我没有亲自尝试
顺便说一句,我的代码就是从这段代码中得到启发的。乍一看,对于序列化原始Java对象,ProtoBuffer或Thrift似乎更合适——它们是为此目的而创建的。Parquet同时支持这两种功能(理论上,大多数人使用AVRO是因为它更面向数据,而且不管怎样,它是对黑斑羚和蜂巢的隐含选择;我预计另一种使用较少的绑定会有更多的bug潜伏在黑暗中)