java mapfile_基于文件的数据结构:关于MapFile
MapFile是已經排過序的SequenceFile,它有索引,所以可以按鍵查找
1.MapFile的寫操作
MapFile的寫操作類似于SequenceFile的寫操作。新建一個MapFile.Writer實例,然后調用append()方法順序寫入文件內容。如果不按順序寫入,就拋出一個IOException異常。鍵必須是WritableComparable類型的實例,值必須是Writable類型的實例。
寫入MapFile,程序如下:
packagecom.lcy.hadoop.io;importjava.net.URI;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.io.IOUtils;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.MapFile;importorg.apache.hadoop.io.Text;public classMapFileWriteDemo {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) throwsException {//TODO Auto-generated method stub
String uri=args[0];
Configuration conf=newConfiguration();
FileSystem fs=FileSystem.get(URI.create(uri),conf);
IntWritable key=newIntWritable();
Text value=newText();
MapFile.Writer writer=null;try{
writer=newMapFile.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
總結
以上是生活随笔為你收集整理的java mapfile_基于文件的数据结构:关于MapFile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 崩坏3PC版什么配置能玩
- 下一篇: 地下城与勇士附魔师如何快速升级