我正面临一个问题,我想进一步减少输出生成我的减速器。我使用CSV作为输入。 CSV显示每个记录都缺少一名学生。
对于每个ClassRoom,计算输入数据中记录至少五名学生缺席的天数。在输出中,输出中的每个记录应该具有代表ClassRoom作为关键字的数字,以及至少有五个学生缺席的天数作为值。
注意:显示的以下输入仅适用于需要处理数据的列。原始CSV具有更多的thaqn 18列,其中包含不同的数据。所以Date列是第10列,Class列是第13列。
Date Class
01/01/2011 12
03/01/2011 12
01/01/2011 12
01/01/2011 12
01/01/2011 12
01/01/2011 12
11/01/2011 12
11/01/2011 13
11/01/2011 13
11/01/2011 13
11/01/2011 13
11/01/2011 13
21/03/2011 14
21/03/2011 14
26/04/2011 12
26/04/2011 12
26/04/2011 12
26/04/2011 12
26/04/2011 12
目前我正在尝试使用以下Map和Reduce
MAP:
public static class TestMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String[] tokens = value.toString().split(",");
String district = tokens[12];
String dateColumn = tokens[9];
if (districtColumn == "Class") {
return;
}
else
{
word.set(district+"|"+dateColumn);
context.write(word, one);
}
}
}
减少:
public static class TestReducer extends Reducer<Text,IntWritable,Text,Text> {
private Text word = new Text();
private Text word2 = new Text();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int no = 0;
int no2 = 0;
for (IntWritable val : values) {
no += val.get();
}
if (no>=5) {
no2 = 1;
String S = key.toString();
String[] A = S.split("\\|");
word.set(A[0]);
word2.set(no2);
context.write(word, word2);
no2++;
}
}
}
实际输出:
12 1
11 1
预期输出:
12 2
11 1