zoukankan      html  css  js  c++  java
  • 基于文件的数据结构:关于MapFile

    MapFile是已经排过序的SequenceFile,它有索引,所以可以按键查找

    1.MapFile的写操作

    MapFile的写操作类似于SequenceFile的写操作。新建一个MapFile.Writer实例,然后调用append()方法顺序写入文件内容。如果不按顺序写入,就抛出一个IOException异常。键必须是WritableComparable类型的实例,值必须是Writable类型的实例。

    写入MapFile,程序如下:

    package com.lcy.hadoop.io;
    
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.MapFile;
    import org.apache.hadoop.io.Text;
    
    public class MapFileWriteDemo {
        private static final String [] DATA={
            "One,two,buckle my shoe",
            "Three,four,shut the door",
            "Five,six,pick up sticks",
            "Seven,eight,lay them straight",
            "Nine,ten,a big fat hen"
        };
    
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            String uri=args[0];
            Configuration conf=new Configuration();
            FileSystem fs=FileSystem.get(URI.create(uri),conf);
            
            IntWritable key=new IntWritable();
            Text value=new Text();
            MapFile.Writer writer=null;
            try{
                writer=new MapFile.Writer(conf,fs,uri,key.getClass(),value.getClass());
                for(int i=0;i<1024;i++){
                    key.set(i+1);
                    value.set(DATA[i%DATA.length]);
                    writer.append(key, value);
                }
            }finally{
                IOUtils.closeStream(writer);
            }
        }
    
    }

     

    运行程序,使用这个程序构建一个MapFile:

    当我输入命令 hadoop fs -lsr numbers.map,可以看到:

    发现numbers.map实际上是一个包含data和index这两个文件的文件夹,且这两个文件都是SequenceFile

    data文件包含所有记录,如下:

    index文件包含一部分键和data文件中键到其偏移量的映射:

    从输出可以看出:默认情况下只有每隔128个键才有一个包含在index文件中,当然也可以调整,调用MapFile.Writer实例的setIndexInterval()方法来设置io.map.index.interval属性即可

    2.MapFile的读操作

    在MapFile依次遍历文件中所有条目的过程类似于SequenceFile中的过程:首先新建一个MapFile.Reader实例,然后调用next()方法,直到返回值为false

  • 相关阅读:
    POJ_1066_Treasure Hunt_判断线段相交
    【转载】VS写汇编程序01:VS2015配置汇编语言开发环境
    【转载】汇编调试程序Debug使用
    【转载】C++ STL快速入门
    Longest Palindromic Substring
    Leetcode经典试题:Longest Substring Without Repeating Characters解析
    C++数组的初始化
    C++题目:回文数判断
    C++-int类型整数超出范围后的处理
    Memorise Me!——用数值做地址,实现快速查找
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4326827.html
Copyright © 2011-2022 走看看