SequenceFile新旧API读写操作

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();
        
        }
        
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值