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

2nc8po8w  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(336)

所以我对大数据管理和hadoop还不太熟悉,但是即使有java的经验,我也不能理解我的程序的行为。所以首先我要给出我的代码和我的输入:这是mapper和reducer代码。

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

}
这是主代码。

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

所以基本上我必须处理这类奥运会运动员的记录:身份证,姓名,性别,年龄,身高,体重,球队,国家奥委会,比赛,年份,季节,城市,运动,项目,奖牌
这是两个记录示例:
3,gunnarnielsenaaby,m,24,0,0,丹麦,den,1920年夏季,1920年夏季,安特卫普,足球,男子足球,0
4,edgar lindenau Aabey,m,34,0,0,丹麦/瑞典,丹麦,1900年夏季,1900年夏季,巴黎,拔河,男子拔河,金
每个运动员都有许多参赛作品,我需要数一数奖牌,并产生一个类似这样的输出:关键(姓名、比赛、性别)值(年龄、团队、运动、金、银、铜、所有奖牌)
“安德鲁·威廉”“安迪”“斯坦菲尔德”1952年夏季m 24美国田径2 0 2
不管怎样,我的代码工作正常,我得到了我想要的奖牌,但我也得到了一个额外的输出(我需要每个运动员参加的每一场比赛都有一个输出,例如1964年夏天和1968年夏天各有一个输出。如你所见,我得到了一个额外的垃圾行,每个正确的一个有4个零)。这是我的输出文件(part-r-00000)的一个示例:
“aagje”“ada”“kok(-van der linden)”1964年夏天f 17荷兰游泳0 2 0 2
“aagje”“ada”“kok(-van der linden)”1964年夏季
“aagje”“ada”“kok(-van der linden)”1968年夏季f 21荷兰游泳1 0 0 1
“aagje”“ada”“kok(-van der linden)”1968年夏季
所以你可以看到在一个正确的输出后,我得到一个空的,有4个零和其他数据丢失。我有2个context.write方法在我的reducer中,所以我怀疑其中一个是错误的,所以如果我删除 context.write(key, value); (在if中)我只得到错误的输出(我给你看了4个零),如果我删除 context.write(key,textValue); 我得到一个空的输出文件。如果我把这两个都保留下来,我就会得到我给你看的“奇怪”的输出(这是正确的,但也是错误的)。我还得到了一个选项卡,用于分隔输出文件中的键和值
我试着尽我所能描述这个问题,但我真的不明白为什么会发生这样的事情,我希望我能更好地解释它,我真的希望有人能帮助我,如果这是一个糟糕的问题,它下降了,我真的想得到一些反馈如何提出更好的问题。提前多谢!!!!

dkqlctbz

dkqlctbz1#

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

相关问题