首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >map reduce作业中奇怪/意外的输出(1个额外的输出)

map reduce作业中奇怪/意外的输出(1个额外的输出)
EN

Stack Overflow用户
提问于 2020-12-13 08:31:56
回答 1查看 41关注 0票数 0

所以我在大数据管理和hadoop方面是新手,但我不能理解我的程序员的行为,即使我有java经验。因此,首先我将给出我的代码和输入:这是mapper和reducer代码。

代码语言:javascript
复制
public class builtdifferent {
    
public static class mybmapper extends Mapper <LongWritable, Text, Text, Text> {
    

        
    Text textKey = new Text();
    Text textValue = new Text();
  

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] field = line.split(",");
            
            String name = field[1];
            String games = field[8];
            String sex = field[2];
            String age = field[3];
            String team = field[6];
            String sport = field[12];
            String medal = field[field.length-1];
            int gold =0 ,silver = 0, bronze = 0;
            if (medal.equals("Gold")|| medal.equals("Silver") || medal.equals("Bronze") || medal.equals("0")) {
                    if (medal.equals("Gold"))
                        gold =1 ;
                    
                    if (medal.equals("Silver"))
                        silver =1 ;
                
                    if (medal.equals("Bronze"))
                        bronze =1 ;
            }   
            context.write(new Text(name + " " + games +  " " +  sex  ), new Text(age + "," + team + "," + sport + "," + gold + "," + silver + "," + bronze));

    }
} 

public static class mybreducer extends Reducer<Text, Text, Text, Text> {
     Text textValue = new Text();
     public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            String team="",sport="", age="";
            //String test="",test2="";
            int mg=0,ms=0,mb=0,a=0;
            
            for (Text value : values) {
                String line = value.toString();
                String[] aif = line.split(",");
                if (aif.length < 6) {
                    context.write(key, value);
                    break;
                }
                age= String.valueOf(aif[0]);
                team = String.valueOf(aif[1]);
                sport = String.valueOf(aif[2]);
                mg+=Integer.valueOf(aif[3]);
                ms+=Integer.valueOf(aif[4]);
                mb+=Integer.valueOf(aif[5]);
            }
    
     a=mg+ms+mb;
     textValue.set(age + " " + team + " " + sport + " " + mg + " " + ms + " " + mb + " " + a);
     context.write(key,textValue);
     }
}

}

这是主要代码。

代码语言:javascript
复制
  Configuration conf2 = new Configuration();
      Job job2 = Job.getInstance(conf2, "best athletes");
      job2.setJarByClass(athletes.class);
      job2.setMapperClass(builtdifferent.mybmapper.class);
      job2.setCombinerClass(builtdifferent.mybreducer.class);
      job2.setReducerClass(builtdifferent.mybreducer.class);
      job2.setOutputKeyClass(Text.class);
      job2.setOutputValueClass(Text.class);
      FileInputFormat.addInputPath(job2, new Path(args[0]));
      FileOutputFormat.setOutputPath(job2, new Path(args[1]));
      System.exit(job2.waitForCompletion(true) ? 0 : 1);

所以基本上我必须处理这种类型的奥运运动员的记录: ID,姓名,性别,年龄,身高,体重,团队,国家奥委会,奥运会,年份,季节,城市,体育,事件,奖牌

这是两个记录示例:

3,GunnarNielsenAaby,M,24,0,0,丹麦,DEN,1920夏天,1920,夏天,安特卫本,足球,足球,男子足球,0

4,Edgar Lindenau Aabye,M,34,0,0,丹麦/瑞典,DEN,1900夏季,1900夏季,巴黎,拔河,男子拔河,金牌

每个运动员都有许多参赛项目,我需要计算奖牌数量并生成如下输出:Key(姓名,比赛项目,性别)值(年龄,团队,运动项目,金牌,银牌,铜牌,所有奖牌)

“安德鲁·威廉”“安迪”“斯坦菲尔德”1952夏季M24美国田径2 0 0 2

无论如何,我的代码可以正常工作,我可以像我想要的那样获得奖牌,但我也可以获得一个额外的输出(我需要为每个运动员参与的每一场比赛提供1个输出,例如,1964年夏季的1个输出和1968年Summer.As的1个输出。你看,我得到了1个额外的垃圾行,每个正确的比赛都有4个0)。这是我的输出文件的示例(part-r-00000):

"Aagje ""Ada"“Kok (-van der Linden)”1964夏季F 17荷兰游泳0 2 0 2

"Aagje ""Ada"“Kok (-van der Linden)”1964夏季F 0 0 0

"Aagje ""Ada"“Kok (-van der Linden)”1968夏季F 21荷兰游泳1 0 0 1

"Aagje ""Ada"“Kok (-van der Linden)”1968夏季F 0 0 0

正如你所看到的,在一次正确的输出之后,我得到了一个空的1,其中有4个0和其他数据丢失。我的reducer中有两个context.write方法,所以我怀疑其中一个是错误的,所以如果我删除context.write(key, value); (在if中),我只能得到错误的输出(带有4个零),如果我删除context.write(key,textValue);,我会得到一个空的输出文件。如果我两者都保留,我会得到我向你展示的“奇怪的”输出(这是正确的,但也是错误的)。我还得到了一个用于分隔输出文件中的键和值的制表符

我试图尽我所能地描述这个问题,但我真的不明白为什么和发生了什么,我希望我能更好地解释它,我真的希望有人能帮助我,如果这是一个糟糕的问题,如果它发生了,我真的希望得到一些反馈,关于如何提出更好的问题。提前感谢大家!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 04:48:59

我实际上找到了答案,我需要在map函数的开头,在String line = value.toString();行的上面添加这个if(((LongWritable)key).get() == 0) { return; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65271296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档