java mapfile_基于文件的数据结构:关于MapFile
MapFile是已經(jīng)排過(guò)序的SequenceFile,它有索引,所以可以按鍵查找
1.MapFile的寫(xiě)操作
MapFile的寫(xiě)操作類似于SequenceFile的寫(xiě)操作。新建一個(gè)MapFile.Writer實(shí)例,然后調(diào)用append()方法順序?qū)懭胛募?nèi)容。如果不按順序?qū)懭?#xff0c;就拋出一個(gè)IOException異常。鍵必須是WritableComparable類型的實(shí)例,值必須是Writable類型的實(shí)例。
寫(xiě)入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);
}
}
}
運(yùn)行程序,使用這個(gè)程序構(gòu)建一個(gè)MapFile:
當(dāng)我輸入命令 hadoop fs -lsr numbers.map,可以看到:
發(fā)現(xiàn)numbers.map實(shí)際上是一個(gè)包含data和index這兩個(gè)文件的文件夾,且這兩個(gè)文件都是SequenceFile
data文件包含所有記錄,如下:
index文件包含一部分鍵和data文件中鍵到其偏移量的映射:
從輸出可以看出:默認(rèn)情況下只有每隔128個(gè)鍵才有一個(gè)包含在index文件中,當(dāng)然也可以調(diào)整,調(diào)用MapFile.Writer實(shí)例的setIndexInterval()方法來(lái)設(shè)置io.map.index.interval屬性即可
2.MapFile的讀操作
在MapFile依次遍歷文件中所有條目的過(guò)程類似于SequenceFile中的過(guò)程:首先新建一個(gè)MapFile.Reader實(shí)例,然后調(diào)用next()方法,直到返回值為false
總結(jié)
以上是生活随笔為你收集整理的java mapfile_基于文件的数据结构:关于MapFile的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 崩坏3PC版什么配置能玩
- 下一篇: java嵌套类型 无法隐藏外层类型_ja