wx_dDlRC9rW 发表于 2019-7-16 10:43:09

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

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函数的。这样输出结 ...

谢谢大佬解答
页: [1]
查看完整版本: TreeMap求TopN,为什么还是全部输出?求大佬解答