分享

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[0];
                String upstring=splitsStrings[1];
                String downString=splitsStrings[2];
                String sum=splitsStrings[3];
                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

已有(2)人评论

跳转到指定楼层
s060403072 发表于 2019-7-16 16:24:40
MapReduce是分布式,有多少个map,就有多少个前10,要想着分布式是每台机器都有一个map函数的。这样输出结果就容易理解了。要想整体输出前10,把他们放到一个reduce里面,然后在输出。如下设置:
job.setNumReduceTasks(1);//设置为1

这样就可以了
回复

使用道具 举报

wx_dDlRC9rW 发表于 2019-8-12 21:01:30
s060403072 发表于 2019-7-16 16:24
MapReduce是分布式,有多少个map,就有多少个前10,要想着分布式是每台机器都有一个map函数的。这样输出结 ...

谢谢大佬解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条