SequenceFile新旧API的读写操作
Hadoop中的SequenceFile
类为二进制键值对提供了一个持久化的数据结构
-
适用场景
- 适用于存储二进制文件
- 适用于存储小文件
- 适用于存储键值对形式的文件
- 日志文件
-
新版API
-
Option实例
-
新版API中为
SequenceFil
的内部类Writer
中添加了Option
内部类,这个类封装了文件路径和键值对的数据类型 -
//获取文件路径Option SequenceFile.Writer.Option pathOption = SequenceFile.Writer.file(Path path); //或取文件键值的Option SequenceFile.Writer.Option keyOption = SequenceFile.Writer.keyClass(Class keyCls); SequenceFile.Writer.Option valueOption = SequenceFile.Writer.valueClass(Class valueCls);
-
-
写操作
-
步骤
- 调用
SequenceFile
类的静态方法createWriter(Configuration conf, Option path, Option key, Option value)
,传入Configuration
实例,以及文件存储路径、键的数据类型、值得数据类型的Option
实例,获取SequenceFile
的内部类Writer
类实例,Writer类中封装了对SequenceFile写入操作的所有方法 - 调用
SequenceFile.Writer.append()
方法,传入之前指定好类型的键值对完成写入操作 - 关闭writer实例数据流
- 调用
-
实例
public static void createSeqenceFileNewAPI() throws IOException { //将文件路径Path实例封装成Option对象 SequenceFile.Writer.Option pathOption = SequenceFile.Writer.file(new Path("hdfs://host:port/test.seq")); //将键值对类型封装为Option对象 SequenceFile.Writer.Option keyOption = SequenceFile.Writer.keyClass(IntWritable.class); SequenceFile.Writer.Option valueOption = SequenceFile.Writer.valueClass(IntWritable.class); //获取writer实例 SequenceFile.Writer writer = SequenceFile.createWriter(conf, pathOption, keyOption, valueOption); for (int i = 0; i < 100; i++) { //向文件写入键值对 writer.append(new IntWritable(i), new IntWritable(i)); } //关闭数据流 writer.close(); }
-
-
读操作
-
步骤
- 调用
SequenceFile
类的静态方法createReader(Option path)
,传入文件存储路的Option
实例,获取SequenceFile
的内部类Reader
类实例,Reader
类中封装了对SequenceFile读取操作的所有方法 - 创建用于读取键值对的变量
- 循环调用
reader.next()
方法,传入创建的两个变量,如果存在下一个值,该方法会返回true反之返回false,每次调用该方法都会将读取的键值对分别存入传入的两个变量中 - 关闭数据流
- 调用
-
实例
public static void checkSeqenceFileNewAPI() throws IOException { //获取Option实例 SequenceFile.Reader.Option pathOption = SequenceFile.Reader.file(new Path("hdfs://hadoop01:9000/sf/test.seq")); //获取Reader实例 SequenceFile.Reader reader = new SequenceFile.Reader(conf, pathOption); //创建两个变量读取数据 IntWritable key = new IntWritable(); IntWritable value = new IntWritable(); while (reader.next(key, value)) { System.out.println(key.toString() + " " + value.toString()); } //关闭数据流 reader.close(); }
-
-
-
旧版API
旧版API中没有Option对象,旧版API通过直接传入Class对象确认数据类型,直接传入Path实例确认文件路径
旧版API中需要传入FileSystem实例才能完成写操作
-
写操作
-
步骤
- 调用
SequenceFile
类的静态方法createWriter(FileSystem fs, Configuration conf, Path path, Class keyCls, Class valueCls)
,获取SequenceFile
的内部类Writer
类实例,Writer
类中封装了对SequenceFile写入操作的所有方法 - 调用
SequenceFile.Writer.append()
方法,传入之前指定好类型的键值对完成写入操作 - 关闭writer实例数据流
- 调用
-
实例
public static void createSeqenceFileOldAPI() throws IOException { //调用SequenceFile静态类的createWriter方法获取Writer内部类实例 //需要传入FileSystem实例,文件路径Path实例,key的class对象以及value的class对象 SequenceFile.Writer writer = SequenceFile.createWriter(fileSystem, conf, new Path("/sf/test.seq"), IntWritable.class, IntWritable.class); for (int i = 0; i < 100; i++) { //调用append方法在SeqenceFile文件末尾追加数据 writer.append(new IntWritable(i), new IntWritable(i)); } //回收资源 writer.close(); }
-
-
读操作
-
步骤
- 调用
SequenceFile
类的静态方法createReader(FileSystem fs, Path path, Configuration conf)
,获取SequenceFile
的内部类Reader
类实例,Reader
类中封装了对SequenceFile
读取操作的所有方法 - 创建键值对指定类型的变量
- 循环调用
reader.next()
方法,传入创建的两个变量,如果存在下一个该方法会返回true反之返回false,每次调用该方法都会将读取的键值对分别存入传入的两个变量中 - 关闭数据流
- 调用
-
实例
public static void checkSeqenceFileOldAPI() throws IOException { //直接实例化SeqenceFile内部类Reader即可 //只需传入FileSystem实例和文件路径Path实例、conf实例 SequenceFile.Reader reader = new SequenceFile.Reader(fileSystem, new Path("hdfs://hadoop01:9000/sf/test.seq"), conf); IntWritable key = new IntWritable(); IntWritable value = new IntWritable(); //读取文件 while (reader.next(key, value)) { System.out.println(key.toString() + " " + value.toString()); } reader.close(); }
-
-