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



所以我是大数据管理和hadoop的新手,但即使有java经验,我也无法理解我的程序行为。因此,首先我要给出我的代码和我的输入:这是映射器和还原器代码。

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

因此,基本上我必须处理这类奥运会运动员的记录:ID,姓名,性别,年龄,身高,体重,团队,NOC,比赛,年份,季节,城市,运动,赛事,奖牌

这是两个记录示例:

3,GunnarNielsenAby,M,24,0,0,丹麦,丹麦,1920年夏季,1920年夏天,安特卫普,足球,足球男子足球,0

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

每个运动员都有很多参赛作品,我需要数奖牌,并产生这样的输出:关键(姓名、比赛、性别(价值(年龄、团队、运动、金牌、银牌、铜牌、所有奖牌(

"Andrew William"Andy"quot;Stanfield";1952年夏季M24美国田径2 0 0 2

不管怎样,我的代码可以工作,我可以随心所欲地获得奖牌,但我也可以获得一个额外的输出(我需要每个运动员为他参加的每一场比赛输出一个,例如1964年夏天和1968年夏天各输出一个。正如你所看到的,我得到了1个额外的垃圾线,每个正确的垃圾线有4个零(。这是我的输出文件(part-r-000000(的一个例子:

"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年夏季F21荷兰游泳1 0 0 1

"Aagje"Ada"Kok(-van der Linden(";1968年夏季F 0 0 0

正如你所看到的,在一个正确的输出之后,我得到了一个空的输出,其中有4个零和其他数据丢失。我的reducer中有两个context.write方法,所以我怀疑其中一个是错误的,所以如果我删除context.write(key, value);(在if中(,我只得到错误的输出(我给你看了4个零(如果我删除CCD_ 2,我得到一个空的输出文件。如果我保留两者;怪异的";我向您展示的输出(这是正确的,但也是错误的(。此外,我得到了一个选项卡,用于分隔输出文件中的键和值

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

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

最新更新