我有以下具有5列和若干行的csv文件。但是我只显示前6行。

Date,Food,Vitamin,Protein,NumStudents
01/01/17, Pasta, A, Yes, 560
01/01/17, Pizza, A, Yes, 730
01/01/17, Burrito, C, Yes, 240
02/01/17, Pizza, A, Yes, 340
02/01/17, Pasta, B, Yes, 450
02/01/17, Beef, B, Yes, 450

现在,我想查找某天只有比萨饼和面食的NumStudents的总和。

本质上,对于01/01/17,我只需要对NumStudents的比萨饼和面食求和,而不必对卷饼进行求和。

预期产量
01/01/17 1290
02/01/17 790

我得到的输出
01/01/17 1530
02/01/17 1240

在我的代码中,我能够对所有3种食物总计NumStudents,但不知道如何从mapper的复合键中选择性地排除某种食物。知道我应该怎么做吗?

最佳答案

您可以只在映射器中过滤您感兴趣的类型。这可能看起来像:

public class InputMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private Text oKey = new Text();
    private IntWritable oValue = new IntWritable();

    @Override
    public void map(LongWritable key, Text value, Context context)
                            throws IOException, InterruptedException {

        String parts[] = value.toString().split(",");
        if (parts[1].equals("Pasta") || parts[1].equals("Pizza")) {
            oKey.set(parts[0]);
            oValue.set(Integer.parseInt(parts[4]));
            context.write(oKey, oValue);
        }
    }
}

因此,在reduce中,您只需要对值求和即可得出总数,而关键是日期。

10-07 17:16