在看过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(…)”更改其内容后,以前的结果键值对将受到影响,因为该键使用相同的文本对象,并且其内容现在已更改。
我错过什么了吗?提前谢谢你纠正我。。。
1条答案
按热度按时间lg40wkob1#
重用对象是避免创建许多新对象的良好实践。因此,
context.write(word, one)
在map()
方法填充并重用word
以及one
物体。write()将生成一个输出键/值对。这个
Hadoop
框架将负责在context.write()
被称为。因此,您可以安全地重用map()
方法。