【问题标题】:How do I return the output of a Hadoop MapReduce job as value/key instead of key/value?如何将 Hadoop MapReduce 作业的输出作为值/键而不是键/值返回?
【发布时间】:2016-09-28 00:35:24
【问题描述】:

例如,典型的 WordCount mapreduce 可能会返回如下输出:

你好 3
世界 4
再次 1

我想稍微改变一下输出的格式,以便它显示这个:

3 你好
4 世界
又是 1 个

我已经阅读了很多想要按值排序的帖子,并且答案建议在第一个的输出上进行第二个 mapreduce 作业。但是,我不需要按值排序,并且多个键可能具有相同的值——我不希望它们被混为一谈。

是否有一种简单的方法可以简单地切换键/值的打印顺序?看起来应该很简单。

【问题讨论】:

  • 有没有试过在reducer代码中切换输出的顺序?
  • 另外,在 Spark 中做起来非常简单(而且代码少得多)

标签: hadoop mapreduce


【解决方案1】:

按简单顺序考虑的两个选项是:

在 Reduce 中切换键/值

修改reduce的输出来切换key和value。例如,Hadoops example WordCount job 中的 reduce 将更改为:

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(result, key);
    }
}

这里的context.write(result, key); 已更改为切换键和值。

使用第二个仅地图作业

您可以使用 Hadoop 提供的InverseMapper (Source) 运行 Map only (0 reducers) 作业来切换键和值。所以你只需要第二份工作,只需要编写驱动程序,看起来像:

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "Switch inputs");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(InverseMapper.class);
    job.setNumReduceTasks(0);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(Text.class);
    job.setInputFormatClass(SequenceFileInputFormat.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

请注意,您可能希望第一个作业使用SequenceFileOutputFormat 写入第一个作业的输出,并使用SequenceFileInputFormat 作为第二个作业的输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    相关资源
    最近更新 更多