需要使用Java应用程序合并Avro文件

时间:2017-11-07 06:05:02

标签: java hadoop

我在hadoop环境下的目录下有多个avro文件,我需要合并所有这些文件并将其作为单个avro文件。 例子

/abc->
        x.avro
        y.avro   } => a.avro
        z.avro

文件a.avro将包含所有x,y,z文件的内容,其中x,y,z文件具有相同的模式。我需要创建一个java应用程序。任何帮助表示赞赏 感谢。

1 个答案:

答案 0 :(得分:2)

为了处理avro文件操作here,apache avro提供的工具很少。这些工具包括Merging / Concat工具,它将相同的模式avro文件与非保留元数据合并,catTool从Avro数据文件中提取样本,转换工具将Avro二进制文件中的输入文件转换为JSON,recoveryTool从损坏的Avro中恢复数据数据文件等(在提到的github网址上查找更多信息)。

我从github上提到的相同工具中提取代码,这是解决你的目的的java应用程序。

Path inPath  = new Path("C:\\Users\\vaijnathp\\IdeaProjects\\MSExcel\\vaj");
Path outPath = new Path("getDestinationPath") ;
FileSystem fs = FileSystem.get(new Configuration());
FileStatus [] contents contents = fs.listStatus(inPath, new OutputLogFilter());
DataFileWriter<GenericRecord> writer = new DataFileWriter<>(new GenericDatumWriter<>());
Schema schema = null;
String inputCodec = null;
Map<String, byte[]> metadata = new TreeMap<>();
BufferedOutputStream output = new BufferedOutputStream(new BufferedOutputStream(fs.create(outPath)));
for (int i = 0; i < contents.length; i++) {
        FileStatus folderContent = contents[i];
        if (folderContent.isFile() && folderContent.getPath().getName().endsWith(".avro")) {
            InputStream input = new BufferedInputStream(fs.open(folderContent.getPath()));
            DataFileStream<GenericRecord> reader = new DataFileStream<>(input, new GenericDatumReader<GenericRecord>());
            if (schema == null) {
                schema = reader.getSchema();
               //extract metadata for further check.
                extractAvroFileMetadata(writer, metadata, reader);
                inputCodec = reader.getMetaString(DataFileConstants.CODEC);
                if (inputCodec == null) inputCodec = DataFileConstants.NULL_CODEC;
                writer.setCodec(CodecFactory.fromString(inputCodec));
                writer.create(schema, output);
            } else {
                if (!schema.equals(reader.getSchema())) reader.close();
                //compare FileMetadata with previously extracted one
                CompareAvroFileMetadata(metadata, reader, folderContent.getPath().getName());
                String thisCodec = reader.getMetaString(DataFileConstants.CODEC);
                if (thisCodec == null) thisCodec = DataFileConstants.NULL_CODEC;
                if (!inputCodec.equals(thisCodec)) reader.close();
            }
            writer.appendAllFrom(reader, false);
            reader.close();
        }
    }
 writer.close();
}catch (Exception e){
    e.printStackTrace();
}

我希望此代码段可以帮助您创建Java应用程序。感谢。