如何使用mapreduce程序在输入文件中获得最后的单词计数



有谁知道在一个简单的单词计数程序中需要做什么修改才能使用map reduce从文件中只获得最后一个单词计数吗?

如果输入文件是

hai hello world
hello world java
hadoop world hai
hello hai java
Expected o/p : world 3

因为'world'将是排序后的最后一个键。

感谢您的帮助

不需要显式排序的One simple way available.

假设您有one reducer运行。您可以在reducer类中重写cleanup()方法。

在reducer中使用cleanup()方法来在reduce任务结束时做家务。

但是你可以利用它。因为cleanup()方法只会在reduce任务之后执行一次。

By the end of your reduce task you will be holding only last key-value pair. Now, instead of emiting that output from reduce() method emit it from cleanup() method.

你可以把context.write()只保存在cleanup()中。

@Override
protected void cleanup(Context context){
    context.write(//keep your key-values here);
}

我相信这可以毫不费力地完成您的工作,您将通过使用上面的3行代码立即获得所需的结果。

设置减速器个数为1。在map端重写默认的排序方法以降序排序,并在驱动程序代码job.setSortComparatorClass.中设置比较器类,并且只从reduce调用中获得第一个Key值。

public class MysortComparator extends WritableComparator
{
    protected MysortComparator()
    {
        super(Text.class,true);
    }
    @SuppressWarnings("rawtypes")
    public int compare(WritableComparable w,WritableComparable w1)
    {
        Text s=(Text)w;
        Text s1=(Text)w1;
        return -1 * s.compareTo(s1);
}

也可以覆盖reducer的run方法,只读取第一条记录并将其传递给reduce调用,而忽略其他记录。如果您的单个reducer要使用大的键/值对,这将避免开销。

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  int rec_cnt = 0;
  while (context.nextKey() && rec_cnt++ < 1) {
    reduce(context.getCurrentKey(), context.getValues(), context);
  }
  cleanup(context);
}

相关内容

  • 没有找到相关文章

最新更新