Java 如何使Hadoop reducer为单个键输出多个值

Java 如何使Hadoop reducer为单个键输出多个值,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我有一些数据集,我想计算每个记录的最小值、最大值和平均值(例如:userID_1--minimum_1--maximum_1--avg) 这是我的代码,我需要知道如何才能让我为单个键编写这些值: public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> v

我有一些数据集,我想计算每个记录的最小值、最大值和平均值(例如:userID_1--minimum_1--maximum_1--avg)

这是我的代码,我需要知道如何才能让我为单个键编写这些值:

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    public void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        int sum = 0;
        int visitsCounter = 0;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        float avg;
        for (IntWritable val : values) {
            int currentValue = val.get();
            sum += currentValue;
            visitsCounter++;
            min = Math.min(min, currentValue);
            max = Math.max(max, currentValue);
        }
        avg = sum / visitsCounter;

        //here can be the supposed edit to let me output (user - min - max - avg )
        context.write(key, new IntWritable(sum));
    }
}
公共静态类Reduce扩展Reducer{
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
整数和=0;
int visitsCounter=0;
int min=整数最大值;
int max=整数的最小值;
浮动平均值;
for(可写入值:值){
int currentValue=val.get();
总和+=当前值;
VisitCounter++;
最小值=数学最小值(最小值,当前值);
最大值=数学最大值(最大值,当前值);
}
平均值=总和/访问计数;
//这里可以是允许我输出的假定编辑(user-min-max-avg)
write(key,newintwriteable(sum));
}
}

在MapReduce中,数据以键值对的形式在两个阶段流动,即Map阶段和Reduce阶段。

因此,我们需要在Map级别和Reduce级别设计键值对

这里的键和值数据类型是可写的

键可以由多个值组成,值可以由多个值组成。

对于原子值的情况,我们使用IntWritable、DoubleWritable、LongWritable、FloatWritable等

对于复杂的键和值数据情况,我们使用文本数据类型或用户定义的数据类型

处理此场景的简单解决方案是使用文本数据类型,即将所有这些列串联成字符串对象,并将此字符串对象序列化为文本对象。但是这是低效的,因为在大型数据集上有大量的字符串连接

使用自定义/用户定义的数据类型来处理此类场景。 使用Hadoop API中的Writable或WritableComparable接口编写自定义数据类型

公共静态类Reduce扩展Reducer{
Text emitValue=新文本()
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
整数和=0;
int visitsCounter=0;
int min=整数最大值;
int max=整数的最小值;
浮动平均值;
for(可写入值:值){
int currentValue=val.get();
总和+=当前值;
VisitCounter++;
最小值=数学最小值(最小值,当前值);
最大值=数学最大值(最大值,当前值);
}
平均值=总和/访问计数;
字符串myValue=min+“\t”+max+“\t”+avg;
emitValue.set(myValue);
//这里可以是允许我输出的假定编辑(user-min-max-avg)
write(键、值);
}
}