Hadoop のマッパーの出力値としてオブジェクト (ツリーなど) を渡すことはできますか? そうですか、どうですか?
質問する
2422 次
1 に答える
3
Tariqのリンクを拡張し、ツリーマップの1つの可能な実装を簡単に詳しく説明するには<Text, IntWritable>
:
public class TreeMapWritable extends TreeMap<Text, IntWritable>
implements Writable {
@Override
public void write(DataOutput out) throws IOException {
// write out the number of entries
out.writeInt(size());
// output each entry pair
for (Map.Entry<Text, IntWritable> entry : entrySet()) {
entry.getKey().write(out);
entry.getValue().write(out);
}
}
@Override
public void readFields(DataInput in) throws IOException {
// clear current contents - hadoop re-uses objects
// between calls to your map / reduce methods
clear();
// read how many items to expect
int count = in.readInt();
// deserialize a key and value pair, insert into map
while (count-- > 0) {
Text key = new Text();
key.readFields(in);
IntWritable value = new IntWritable();
value.readFields(in);
put(key, value);
}
}
}
基本的に、Hadoopのデフォルトのシリアル化ファクトリは、オブジェクト出力がWritableインターフェース(上記で詳述したreadFieldsおよびwriteメソッド)を実装することを期待しています。このようにして、ほとんどすべてのクラスを拡張して、シリアル化メソッドを後付けすることができます。
org.apache.hadoop.io.serializer.JavaSerialization
もう1つのオプションは、構成プロパティを構成してJavaシリアル化(デフォルトのJavaシリアル化メソッドを使用)を有効にすることですio.serializations
が、これはお勧めしません。
于 2012-12-19T23:30:51.623 に答える