關於自定義數據類型,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<String,String>.
*/
public class HDFSDocument implements Writable{
HashMap<String,String> fields = new HashMap<String, String>();
public void setFields(HashMap<String,String> fields){
this.fields = fields;
}
public HashMap<String,String> 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<String> iter = fields.keySet().iterator();
while(iter.hasNext()){
key = iter.next();
value = fields.get(key);
// 依次寫入<Key,Value>兩個字符串
out.writeUTF(key);
out.writeUTF(value);
}
}
}
在MapReduce中使用時,設置相應的Map或Reduce的class類型即可。
