1

在我的输入文件中,我有一列作为国家。现在,我的任务是将特定国家的记录放入以该国家命名的单独文件中。这可以在 Map-reduce 中做到吗?!请分享您对此的想法。

4

2 回答 2

4

是的,在 hadoop 中,您可以使用MultipleOutputFormat它的方法来做到这一点generateFileNameForKeyValue

使用您的国家名称作为键和记录作为值,这应该完全按照您的需要工作。

于 2013-05-08T10:58:48.763 回答
3

如果您使用新的 API,您应该查看MultipleOutputs类。这个类中有一个例子。

作业提交的使用模式:



    工作工作 = 新工作();

    FileInputFormat.setInputPath(job, inDir);
    FileOutputFormat.setOutputPath(job, outDir);

    job.setMapperClass(MOMap.class);
    job.setReducerClass(MOReduce.class);
    ...

    // 为作业定义附加的基于单个文本的输出“文本”
    MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
    LongWritable.class, Text.class);

    // 为作业定义额外的基于序列文件的输出“序列”
    MultipleOutputs.addNamedOutput(job, "seq",
      SequenceFileOutputFormat.class,
      LongWritable.class, Text.class);
    ...

    作业.waitForCompletion(true);
    ...

在减速机中的用法:


    字符串 generateFileName(K k, V v) {
       返回 k.toString() + "_" + v.toString();
    }

    公共类 MOReduce 扩展
       减速机{
         私有MultipleOutputs mos;
         公共无效设置(上下文上下文){
          ...
              mos = new MultipleOutputs(context);
          }

         public void reduce(WritableComparable key, Iterator values,
                上下文上下文)
                抛出 IOException {
          ...
     mos.write("text", , key, new Text("Hello"));
     mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a");
     mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b");
     mos.write(key, new Text("value"), generateFileName(key, new Text("value")));
     ...
      }

    公共无效清理(上下文)抛出 IOException {
         mos.close();
     ...
    }
   }

于 2013-05-11T17:05:22.857 回答