【问题标题】:Finding biggest value for key寻找钥匙的最大价值
【发布时间】:2015-07-09 18:49:11
【问题描述】:

我想找出面积最大的国家。

我的数据集如下

Afghanistan 648
Albania 29
Algeria 2388
Andorra 0
Austria 84
Bahrain 1
Bangladesh  143
Belgium 31
Benin   113
Bhutan  47
Brunei  6
Bulgaria    111
Burma   678
Cameroon    474
Central-African-Republic    623
Chad    1284
China   9561
Cyprus  9
Czechoslovakia  128
Denmark 43
Djibouti    22
Egypt   1001
Equatorial-Guinea   28
Ethiopia    1222
Finland 337
France  547
Germany-DDR 108
Germany-FRG 249
Greece  132
Guam    0
Hong-Kong   1
Hungary 93
India   3268

谁能帮我写mapreduce程序?

我的 mapper 和 reducer 代码是这样的

映射器

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
        String[] tokens = value.toString().split(",");
        if(Integer.parseInt(tokens[2]) == 1){
            context.write(new Text(tokens[0]), new IntWritable(Integer.parseInt(tokens[3])));
        }
    }

减速器

public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
        int max = 0;
        for(IntWritable x : values){
            if(max < Integer.parseInt(String.valueOf(x))){
                max = Integer.parseInt(String.valueOf(x));
            }
        }
        context.write(key, new IntWritable(max));
    }

【问题讨论】:

  • 那么你尝试了什么,你卡在哪里了? Stackoverflow 不是代码编写服务。
  • 感谢@ThomasJungblut 的回复,我已经编辑了我的问题并添加了映射器和reducer 代码,我在某个地方缺乏实现逻辑。

标签: hadoop mapreduce


【解决方案1】:

算法很简单,在映射器中收集最大值并在映射器结束时使用cleanup 将其写入磁盘。

int max = Integer.MIN_VALUE;
String token;

@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] tokens = value.toString().split(",");
        if(Integer.parseInt(tokens[2]) == 1){       
            int val = Integer.parseInt(tokens[3])
            if(Integer.parseInt(tokens[3]) > max){
                max = val;
                token = tokens[0];
            }
        }
}

@Override
public void cleanup(Context context) throws IOException, InterruptedException {    
    context.write(new LongWritable(max), new Text(token));    
}

现在你所有的东西都在最大值上减少了,这意味着如果我们降序排序,你会得到最大值作为减速器中的第一条记录。因此,您需要在工作中进行设置:

job.setSortComparatorClass(LongWritable.DecreasingComparator.class);

reducer 是一个简单找到/未找到的开关,如果每个国家/地区具有最大值(第一条记录),它只会输出它。

boolean foundMax = false;

@Override
public void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
        if(!foundMax){
            for(Text t : values){
                context.write(t, key);
            }
            foundMax = true;
        }              
}

【讨论】:

  • 所以@ThomasJunglblut 我们没有在 map 中设置键和值,cleanUp 的作用是什么以及何时调用?
  • Cleanup 是映射器的最终操作。
  • 谢谢兄弟,它正在工作......但我想知道我们没有在映射器的上下文中设置键值,那么值是如何传递给减速器的,你能告诉我在这种特殊情况下的架构视图吗是否容易为您描述
  • 因为你没有设置东西,你正在写入一个流。这就是context.write(k,v) 所做的。
  • 嗨@ThomasJunglblut 这个例子在没有减速器的情况下工作,为什么?我们是否需要这个减速器
猜你喜欢
  • 2010-12-12
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多