我有一些数据集,我想计算每条记录的最小值,最大值和平均值(例如: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));
    }
}

最佳答案

在MapReduce中,数据在两个阶段(即 Map阶段和Reduce阶段)根据键值对进行流动。

因此,我们需要在“ map 级别”和“缩小级别”设计键值对

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

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

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

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

处理这种情况的简单解决方案是使用文本数据类型,即将所有这些列串联到String对象中,然后将此String对象序列化为Text对象。但这是效率低下的,这是由于在大型数据集上存在许多字符串连接。

使用自定义/用户定义的数据类型来处理这种情况。
使用 Hadoop API 中的Writable或WritableComparable 接口(interface)编写自定义数据类型。

public static class Reduce extends Reducer<Text, IntWritable, Text, Text> {
    Text emitValue = new Text()
    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;
        String myValue = min + "\t" + max + "\t" + avg;
        emitValue.set(myValue);
        //here can be the supposed edit to let me output (user - min - max - avg )
        context.write(key, emitValue);
    }
}

关于java - 如何使Hadoop Reducer为单个键输出多个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38120952/

10-13 03:27