您的映射器将您的输入映射到您想要取平均值的值。因此,假设您的输入是一个文本文件,其格式类似于
ProcessName Time
process1 10
process2 20
.
.
.
然后您需要获取文件中的每一行,拆分它,获取第二列,然后将该列的值输出为IntWritable(或其他一些Writable 数字类型)。由于您想取所有时间的平均值,而不是按进程名称或任何内容分组,因此您将拥有一个固定键。因此,您的映射器看起来像
private IntWritable one = new IntWritable(1);
private IntWritable output = new IntWritable();
proctected void map(LongWritable key, Text value, Context context) {
String[] fields = value.split("\t");
output.set(Integer.parseInt(fields[1]));
context.write(one, output);
}
您的减速器采用这些值,并简单地计算平均值。这看起来像
IntWritable one = new IntWritable(1);
DoubleWritable average = new DoubleWritable();
protected void reduce(IntWritable key, Iterable<IntWrtiable> values, Context context) {
int sum = 0;
int count = 0;
for(IntWritable value : values) {
sum += value.get();
count++;
}
average.set(sum / (double) count);
context.Write(key, average);
}
我在这里做了很多假设,关于您的输入格式和其他什么,但它们是合理的假设,您应该能够根据您的确切需求进行调整。
我的输出会一直是文本文件,还是可以直接将平均值存储在某种变量中?
这里有几个选项。您可以对作业的输出进行后处理(写入单个文件),或者,由于您正在计算单个值,因此可以将结果存储在计数器中。