我在hadoop环境下的目录下有多个avro文件,我需要合并所有这些文件并将其作为单个avro文件。 例子
/abc->
x.avro
y.avro } => a.avro
z.avro
文件a.avro将包含所有x,y,z文件的内容,其中x,y,z文件具有相同的模式。我需要创建一个java应用程序。任何帮助表示赞赏 感谢。
答案 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应用程序。感谢。