Проблема заключается в количестве генерируемых токенов и количестве токенов, к которым вы обращаетесь.Во внутреннем цикле while количество сгенерированных токенов будет равно 7. Но вы получаете доступ только к 4 из них одновременно.Что вам нужно сделать, это получить доступ ко всем токенам одновременно.Поскольку вам нужны только столбцы 1 и 3, получите их и сохраните отдельно.
public static class SumMap extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text str = new Text();
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer tokenIter = new StringTokenizer(lineIter.nextToken(), "\\s+");
while (tokenIter.hasMoreTokens()) {
String c1 = tokenIter.nextToken();
String c2 = tokenIter.nextToken();
String c3 = tokenIter.nextToken();
String c4 = tokenIter.nextToken();
String c5 = tokenIter.nextToken();
String c6 = tokenIter.nextToken();
String c7 = tokenIter.nextToken();
str.set(c1+c3);
context.write(str, one);
}
}
}
main:
public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "sum");
job.setJarByClass(SumMR.class);
job.setMapperClass(SumMap.class);
// job.setCombinerClass(IntSumReducer.class);
// job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
TextInputFormat.addInputPath(job, new Path(args[1]));
FileOutputFormat.setOutputPath(job, new Path(args[2]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
Это модифицированный код.Если есть проблема, дайте мне знать!