0

我有一个 Mapper 类,它给出了一个文本键和IntWritable值,它可以是 1 二或三。根据值,我必须使用不同的键编写三个不同的文件。我得到一个没有记录的单文件输出。另外,您可以指导我做任何好的多输出示例(带有解释)吗?

我的驱动程序类有这个代码:

    MultipleOutputs.addNamedOutput(job, "name", TextOutputFormat.class, Text.class,     IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "attributes", TextOutputFormat.class, Text.class, IntWritable.class);
    MultipleOutputs.addNamedOutput(job, "others", TextOutputFormat.class, Text.class, IntWritable.class);

我的减速机类是:

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

    private MultipleOutputs mos;
    public void setup(Context context) {
        mos = new MultipleOutputs(context);
    }
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        String CheckKey = values.toString();
        if("1".equals(CheckKey)) {
            mos.write("name", key, new IntWritable(1));
        }
        else if("2".equals(CheckKey)) {
            mos.write("attributes", key, new IntWritable(2));
        }
        else if("3".equals(CheckKey)) {
            mos.write("others", key,new IntWritable(3));
        }

        /* for (IntWritable val : values) {
            sum += val.get();
        }*/
        //context.write(key, null);
    }
    @Override
    public void cleanup(Context context) throws IOException, InterruptedException {
        mos.close();
    }
}

PS 我是 HADOOP/MAP-Reduce 编程的新手。

4

2 回答 2

2
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(1);
System.out.println(l.toString());

导致 "[1]" 不是 1 所以

values.toString()

不会给出“1”

除此之外,我只是尝试打印一个 Iterable 并且它只是提供了一个参考,所以这绝对是你的问题。如果要迭代值,请按照以下示例进行操作:

Iterator<Text> valueIterator = values.iterator();
while (valueIterator.hasNext()){

}

请注意,您只能迭代一次!

于 2013-10-04T11:39:48.200 回答
0

你的问题陈述很混乱。你是什​​么意思,“取决于价值观”?reducer 获得一个 Iterable 值,而不是单个值。有些东西告诉我,您需要将减速器中的多个输出代码移动到您已注释掉以求总和的循环内。

或者也许您根本不需要减速器,并且可以在映射阶段处理这个问题。如果您使用 reduce 阶段通过使用单个 reduce 任务最终得到 4 个文件,那么您还可以通过在 map 阶段翻转键和值并完全忘记 MultipleOutputs 来实现您想要的,因为您将结束最多只有 3 个工作 reduce 任务,每个 int 值一个。要获得第 4 个,您可以在每个 map 调用中使用特殊键输出记录的两个副本,以指示输出用于普通文件,而不是三个特殊文件之一。通常我不会推荐这样的做法,因为当键的数量很少时,您可以在减少阶段实现的并行度受到严格限制。

如果您遇到的值不是您期望的三个值之一,您还应该在“if”阶梯的末尾包含一些异常数据处理代码,这些代码会增加一个计数器或其他东西。

于 2013-10-04T13:16:02.827 回答