java在hadoop中计算n的最大值

exdqitrt  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(266)

我有个设想。上一个作业的输出1
下一份工作我要找 i 具有最大值的键。例如i=3,3个具有最大值的键( i 将是自定义参数)
如何处理这个问题。
我们应该计算一下吗 max 在job2mapper中,由于输出来自先前的reducer或find,因此将有唯一的键 max 在第二份工作中,又该怎么找呢 i 钥匙?
更新
我试着用这种方法代替在reducer中以值的形式发出值,我以键的形式发出值,这样我就可以按升序获得值。我写了下一个mr作业,其中mapper只发出键/值。
reducer找到了key的最大值,但是我再次被卡住了,当我们试图获取id时,这无法完成,因为id是唯一的,值不是uniqe。
如何解决这个问题。
有人能提出解决这个问题的办法吗。
提前谢谢。

9udxz4iz

9udxz4iz1#

你可以找到top i 钥匙 PriorityQueue . 简单的代码来说明这个想法:

public static class TopNMapper extends Mapper<IntWritable, DoubleWritable, IntWritable, DoubleWritable> {
    private static class MyPair implements Comparable<MyPair> {
        public final int key;
        public final double value;

        MyPair(int key, double value) {
            this.key = key;
            this.value = value;
        }

        @Override
        public int compareTo(MyPair o) {
            return -Double.compare(value, o.value); // i'm not sure about '-'
        }
    }

    private final PriorityQueue<MyPair> topN = new PriorityQueue<MyPair>();

    @Override
    protected void map(IntWritable key, DoubleWritable value, Context context) throws IOException, InterruptedException {
        if (Double.isNaN(value.get())) {
            return; // not a number
        }
        topN.add(new MyPair(key.get(), value.get()));
        if (topN.size() <= 50) { // simple optimization
            return;
        }
        while (topN.size() > 3) { // retain only top 3 elements in queue
            topN.poll();
        }
    }

    @Override
    protected void cleanup(Context context) throws IOException, InterruptedException {
        while (topN.size() > 3) {
            topN.poll(); // retain only top 3 elements in queue
        }
        for (MyPair myPair : topN) { // write top 3 elements
            context.write(new IntWritable(myPair.key), new DoubleWritable(myPair.value));
        }
    }
}

如果您运行这个Map器(一个用于所有输入),您应该得到3个最大值的键​​.

相关问题