为什么我们可以在wordcount示例中重用文本对象

mkshixfv  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

在看过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);**
    }
}....

我的问题是,如果每个Map任务中只有一个文本对象,在使用“word.set(…)”更改其内容后,以前的结果键值对将受到影响,因为该键使用相同的文本对象,并且其内容现在已更改。
我错过什么了吗?提前谢谢你纠正我。。。

lg40wkob

lg40wkob1#

重用对象是避免创建许多新对象的良好实践。因此, context.write(word, one)map() 方法填充并重用 word 以及 one 物体。
write()将生成一个输出键/值对。这个 Hadoop 框架将负责在 context.write() 被称为。因此,您可以安全地重用 map() 方法。

相关问题