SequenceFIle的内部格式取决于是否启用压缩,如果是压缩,则又可以分为记录压缩和块压缩。
有以下三种类型的压缩:
无压缩类型:如果没有启用压缩(默认设置)那么每个记录就由它的记录长度(字节数)、键的长度,键和值组成。长度字段为4字节
记录压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意:键是不压缩的。下图为记录压缩:
块压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由io.seqfile.compress.blocksize中的属性定义。默认值是1000000字节。格式为记录数、键长度、键、值长度、值。下图为块压缩:
public class SequenceFileReader {
//定义文件读取的路径
private static final String INPATH = "hdfs://liaozhongmin:9000";
public static void main(String[] args) {
try {
//创建配置信息
Configuration conf = new Configuration();
//创建文件系统
FileSystem fs = FileSystem.get(new URI(INPATH),conf);
//创建Path对象
Path path = new Path(INPATH + "/tmp.seq");
//创建SequenceFile.Reader对象
SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
//创建Key和value
Text key = new Text();
Text value = new Text();
//从tmp.seq中循环读取内容
while (reader.next(key, value)){
System.out.println("key=" + key);
System.out.println("value=" + key);
System.out.println("position=" + reader.getPosition());
}
//关闭资源
IOUtils.closeStream(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class MapFileWriter {
//定义压缩的路径
private static final String URL = "hdfs://liaozhongmin:9000";
public static void main(String[] args) {
try {
//1.创建Configuration
Configuration conf = new Configuration();
//2.获取FileSystem
FileSystem fileSystem = FileSystem.get(new URI(URL), conf);
//3.创建文件输出路径Path
Path path = new Path(URL + "/mapfile");
//4.new一个MapFile.Writer对象
MapFile.Writer writer = new MapFile.Writer(conf, fileSystem, path.toString(), Text.class, Text.class);
//5.调用MapFile.Writer.append()方法追加写入
writer.append(new Text("name"), new Text("liaozhongmin"));
//关闭流
writer.close();
} catch (Exception e) {
throw e;
}
}
}
public class MapFileReader {
//定义文件读取的路径
private static final String INPATH = "hdfs://liaozhongmin:9000";
public static void main(String[] args) {
try {
//创建配置信息
Configuration conf = new Configuration();
//创建文件系统
FileSystem fs = FileSystem.get(new URI(INPATH),conf);
//创建Path对象
Path path = new Path(INPATH + "/mapfile");
//4.new一个MapFile.Reader进行读取
MapFile.Reader reader = new MapFile.Reader(fs, path.toString(), conf);
//创建Key和Value
Text key = new Text();
Text value = new Text();
//遍历获取结果
while (reader.next(key, value)){
System.out.println("key=" + key);
System.out.println("value=" + value);
}
//关闭流
IOUtils.closeStream(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
}
内容来源于网络,如有侵权,请联系作者删除!