看到Hadoop示例:WordCount之后,我不明白为什么我们可以重用Text对象,而不是为每个写入操作“ context.write(...)”创建一个新对象?
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
**private Text word = new Text();**
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
// set other String in Text object
**word.set(itr.nextToken());**
**context.write(word, one);**
}
}....
我的问题是,每个映射任务中是否只有一个Text对象,在通过使用“ word.set(...)”更改其内容之后,由于键使用相同的Text对象及其内容现在已更改。
我错过了什么吗?预先感谢您纠正我...
答案 0 :(得分:0)
重用对象是避免创建许多新对象的良好实践。因此,context.write(word, one)
方法中的map()
填充并重新使用word
和one
对象。
context.write()将生成一个输出键/值对。 Hadoop
框架将在调用context.write()
时负责序列化数据。因此,您可以安全地重用map()
方法中的对象。