|
关于自定义数据类型,http://book.douban.com/annotation/17067489/ 一文中给出了一个比较清晰的说明和解释。
在本文中,将给出一个简单的自定义的数据类型例子。我曾使用该自定义的数据类型在HDFS上构建Lucene索引。
package hdfs.document;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableUtils;
/*
* 自定义的一种hadoop输出类型,存储的内容是一个Map.
*/
public class HDFSDocument implements Writable{
HashMap fields = new HashMap();
public void setFields(HashMap fields){
this.fields = fields;
}
public HashMap getFields(){
return this.fields;
}
@Override
public void readFields(DataInput in) throws IOException {
fields.clear();
String key = null, value = null;
int size = WritableUtils.readVInt(in);
for (int i = 0; i < size; i ++){
// 依次读取两个字符串,形成一个Map值
key = in.readUTF();
value = in.readUTF();
fields.put(key,value);
}
}
}
@Override
public void write(DataOutput out) throws IOException {
String key = null, value = null;
Iterator iter = fields.keySet().iterator();
while(iter.hasNext()){
key = iter.next();
value = fields.get(key);
// 依次写入两个字符串
out.writeUTF(key);
out.writeUTF(value);
}
}
}
在MapReduce中使用时,设置相应的Map或Reduce的class类型即可。
|
|
|
|
|
|
|