Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将自定义java对象写入拼花地板_Java_Hadoop_Hdfs_Parquet - Fatal编程技术网

将自定义java对象写入拼花地板

将自定义java对象写入拼花地板,java,hadoop,hdfs,parquet,Java,Hadoop,Hdfs,Parquet,我有一些自定义java对象(内部由其他自定义对象组成)。我希望将这些以拼花格式写入HDFS 即使经过大量搜索,大多数建议似乎都是使用avro格式和拼花地板的内部AvroConverter来存储对象 看到这一点,我似乎必须编写一个自定义WriterSupport来实现这一点 有更好的方法吗?直接编写自定义对象或使用类似Avro的东西作为中间模式定义,哪个更为理想?您可以使用Avro反射来获取模式。其代码类似于ReflectData.AllowNull.get().getSchema(CustomC

我有一些自定义java对象(内部由其他自定义对象组成)。我希望将这些以拼花格式写入HDFS

即使经过大量搜索,大多数建议似乎都是使用avro格式和拼花地板的内部AvroConverter来存储对象

看到这一点,我似乎必须编写一个自定义WriterSupport来实现这一点


有更好的方法吗?直接编写自定义对象或使用类似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潜伏在黑暗中)