当前位置: 首页 > 知识库问答 >
问题:

为密钥寻找最大价值

朱海超
2023-03-14

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

我的数据集如下

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程序吗?

我的映射器和缩减器代码如下

制图员

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));
    }

共有1个答案

毋城
2023-03-14

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

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);

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

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;
        }              
}
 类似资料:
  • 我有一个熊猫数据框,有两列,一列是温度,另一列是时间。 我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。 这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。 有没有内置的熊猫工具可以做到这一点?

  • 我想出了四种方法来解决这个问题,但没有一种方法真正适用于大型RDD,我希望有人能帮助我。 我有一个格式为((x,y),(sim,sim ')的火花RDD,其中x和y是两个索引,sim和sim '是x和y的两个不同的相似性度量。我有兴趣寻找具有最大sim '值的元组。我想出了一些方法来做到这一点,但每种方法都有其问题,最终这些方法都不能应用于大规模的RDD,如10亿元组的RDD。 假设res_dic

  • 问题内容: 我无法在上创建索引。 MySQL: 问题答案:

  • 问题内容: 当我执行以下命令时: 我收到此错误消息: 有关column1和column2的信息: 我认为只需要21个字节,而只需要501个字节。因此,总字节数是522,少于767。那么为什么收到错误消息? 问题答案: 在MySQL版本5.6(及更早版本)中,InnoDB表的前缀限制为767个字节。MyISAM表的长度为1,000字节。在MySQL 5.7及更高版本中,此限制已增加到3072字节。

  • 我想在Azure密钥金库里储存一些更大的秘密。 所以我想知道在Azure Key Vault中可以作为秘密存储的值的最大大小是多少?