首页 文章

Hadoop map-reduce编程

提问于
浏览
0

大家好,我是Hadoop Map-reduce的新手请帮助我的输入是很多文本文件,我想编写map-reduce程序,这样就可以将所有文件名和相关句子与文件名一起写入一个输出文件中我想从mapper中发出文件名(键)和相关句子(值),reducer将收集键和所有值,并在输出中写入文件名及其相关句子 . 所以我的MAPPER和REDUCER如下

public void map(Text key, Text value, OutputCollector<Text,Text> output,         `              Reporter reporter) throws IOException {
 StringTokenizer itr = new StringTokenizer(value.toString(),",");
       String filename = new String();
       FileSplit filesplit = (FileSplit)reporter.getInputSplit();
       filename=filesplit.getpath().getName();
    while(itr.hasMoreTokens())
 {
  word.set(itr.nextToken());
  output.collect(new Text(filename), word);
 }

  }

   }


          public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, 

  Text> output, Reporter reporter) throws IOException {
//    int sum = 0;
String translation = "";
while(values.hasNext())
{
    translation += "|" + values.toString() + "|";
}

results.set(translation);
output.collect(key, results);
    }

当我使用相同的inputformat(keyvaluetextinputformat.class)配置运行上面的mapper和reducer时,它不会在输出中写任何东西 .

我应该改变什么来实现我的目标..

1 回答

  • 2

    在reduce方法中,您将值声明为迭代器 . 它应该被声明为Iterable .

    public void reduce(Text key, Iterable<Text> values, ....
    

    代替

    public void reduce(Text key, Iterator<Text> values, ....
    

    完成后,您可以:

    Iterator<Text> iter = values.iterator();
    while(iter.hasNext())
    {
        translation += "|" + iter.next().toString() + "|";
    }
    

    因为您使用了错误的类型,所以该方法不会覆盖默认的reduce方法,该方法不执行任何操作 . 这就是为什么你没有输出 .

    我也看不到你在哪里声明变量结果 .

相关问题