有谁知道在一个简单的单词计数程序中需要做什么修改才能使用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);
}