那么,基于这三种压缩类型,Hadoop提供了对应的三种类型的Writer:
// Writer内部类用于文件的写操作,假设Key和Value都为Text类型
SequenceFile.Writer writer = SequenceFile.createWriter(conf,
Writer.file(seqFile),
Writer.keyClass(Text.class),
Writer.valueClass(Text.class),
Writer.compression(CompressionType.NONE));
SequenceFile可通过如下API来完成新记录的添加操作:
writer.append(key,value)
//前提是Key和Value需具备序列化和反序列化的功能
SequenceFile.Reader reader=new SequenceFile.Reader(fs,seqFile,conf);
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
Path seqFile = new Path("/test/seqFile2.seq");
// Writer内部类用于文件的写操作,假设Key和Value都为Text类型
SequenceFile.Writer writer = SequenceFile.createWriter(conf,
Writer.file(seqFile), Writer.keyClass(Text.class),
Writer.valueClass(Text.class),
Writer.compression(CompressionType.NONE));
// 通过writer向文档中写入记录
writer.append(new Text("key"), new Text("value"));
IOUtils.closeStream(writer);// 关闭write流
// 通过reader从文档中读取记录
SequenceFile.Reader reader = new SequenceFile.Reader(conf,
Reader.file(seqFile));
Text key = new Text();
Text value = new Text();
while (reader.next(key, value)) {
System.out.println(key);
System.out.println(value);
}
IOUtils.closeStream(reader);// 关闭read流
}
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
Path mapFile=new Path("mapFile.map");
//Reader内部类用于文件的读取操作
MapFile.Reader reader=new MapFile.Reader(fs,mapFile.toString(),conf);
//Writer内部类用于文件的写操作,假设Key和Value都为Text类型
MapFile.Writer writer=new MapFile.Writer(conf,fs,mapFile.toString(),Text.class,Text.class);
//通过writer向文档中写入记录
writer.append(new Text("key"),new Text("value"));
IOUtils.closeStream(writer);//关闭write流
//通过reader从文档中读取记录
Text key=new Text();
Text value=new Text();
while(reader.next(key,value)){
System.out.println(key);
System.out.println(key);
}
IOUtils.closeStream(reader);//关闭read流
注意:使用MapFile或SequenceFile虽然可以解决HDFS中小文件的存储问题,但也有一定局限性,如: 1. 文件不支持复写操作,不能向已存在的SequenceFile(MapFile)追加存储记录。 2. 当write流不关闭的时候,没有办法构造read流。也就是在执行文件写操作的时候,该文件是不可读取的。
喜欢 (0)or分享 (0)