将自定义Java对象写入Parquet
发布时间:2020-12-15 02:12:53 所属栏目:Java 来源:网络整理
导读:我有一些自定义 java对象(内部由其他自定义对象组成).我希望以镶木地板格式将这些内容写入HDFS. 即使经过大量的搜索,大多数建议似乎都是使用avro格式和来自镶木地板的内部AvroConverter来存储对象. 看到这个here和here,我似乎必须编写一个自定义的WriterSupp
我有一些自定义
java对象(内部由其他自定义对象组成).我希望以镶木地板格式将这些内容写入HDFS.
即使经过大量的搜索,大多数建议似乎都是使用avro格式和来自镶木地板的内部AvroConverter来存储对象. 看到这个here和here,我似乎必须编写一个自定义的WriterSupport来完成这个任务. 有一个更好的方法吗?哪个更优,直接编写自定义对象或使用像Avro这样的中间模式定义? 解决方法
您可以使用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代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |