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
时间: 2024-11-05 07:38:16