2016-12-07 80 views
2

我有一个小项目,其中有一个带有2个制表符分隔的文本列的文件。 我想让我的映射器从文件中读取它们,并将第二列设置为键,将第一列设置为reducer的值,但似乎无法完成。 然后,我想将(键,值)对传递给reducer,它将为每个键为其所有值创建一个列表。Mapreduce映射器传递键和值作为文本字段

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { 

    private final static IntWritable one = new IntWritable(1); 
    private Text site = new Text(); 
    private Text tag = new Text(); 

    public void map(Object key, Text value, Context context) 
         throws IOException, InterruptedException { 

     StringTokenizer itr = new StringTokenizer(value.toString(), "\t"); 
     while (itr.hasMoreTokens()) { 
      site.set(itr.nextToken()); 
      tag.set(itr.nextToken()); 
      context.write(tag, site); 
     } 
    } 
} 

我在conext.write行发生错误。 我该如何解决这个问题?

回答

3

您在context.write(tag, site);中写入的值(网站)是Text对象,但您有Mapper<Object, Text, Text, IntWritable>。您应该将其更改为Mapper<Object, Text, Text, Text>

现在你告诉它,你将输出一个IntWritable作为值。

您还可以删除private final static IntWritable one = new IntWritable(1);,因为它没有被使用。

相关问题