加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

将自定义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代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读