任何人都可以告诉在简单的字数统计程序中需要做什么修改才能使用map reduce从文件中获取最后一个字数。
如果输入文件是
hai hello world hello world java hadoop world hai hello hai java Expected o/p : world 3
因为'世界'将是排序后的最后一个关键。
感谢任何帮助
答案 0 :(得分:2)
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 :(得分:1)
将reducers的数量设置为1.并且在map side中覆盖默认排序方法以按降序排序并在驱动程序代码中设置comparartor类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);
}