TreeMap求TopN,为什么还是全部输出?求大佬解答
public class FlowMapper extends Mapper<LongWritable, Text, Flowbean, Text>{TreeMap<Flowbean, String> m=new TreeMap<Flowbean, String>();
@Override
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
//获取行
String lineString=value.toString();
//切割
String []splitsStrings=lineString.split("\t");
//赋值给bean对象
String phonenum=splitsStrings;
String upstring=splitsStrings;
String downString=splitsStrings;
String sum=splitsStrings;
Text keyText=new Text(phonenum);
Flowbean valuefFlowbean=new Flowbean();
valuefFlowbean.set(Long.parseLong(upstring), Long.parseLong(downString));
valuefFlowbean.setFlow_sum(Long.parseLong(sum));
//将对象加入treeMap
m.put(valuefFlowbean, phonenum);
if (m.size()>10) {
m.remove(m.lastKey());
}
为什么明明在最后判断了m.size()>10,可m.remove(m.lastKey())就是不会触发,导致输出的全部结果输出 而不是前10 MapReduce是分布式,有多少个map,就有多少个前10,要想着分布式是每台机器都有一个map函数的。这样输出结果就容易理解了。要想整体输出前10,把他们放到一个reduce里面,然后在输出。如下设置:
job.setNumReduceTasks(1);//设置为1
这样就可以了
s060403072 发表于 2019-7-16 16:24
MapReduce是分布式,有多少个map,就有多少个前10,要想着分布式是每台机器都有一个map函数的。这样输出结 ...
谢谢大佬解答
页:
[1]