-1

我是 Hadoop 和 MapReduce 的新手,一直在尝试根据键将输出写入多个文件。谁能提供有关如何使用它的清晰想法或Java代码片段示例。我的映射器工作得很好,在随机播放之后,键和相应的值按预期获得。谢谢!

我想要做的是将输入文件中的几条记录输出到新文件中。因此,新的输出文件应该只包含那些需要的记录,而忽略其他不相关的记录。即使我不使用 MultipleTextOutputFormat,这也可以正常工作。我在mapper中实现的逻辑如下:

 public static class MapClass extends
            Mapper {

StringBuilder emitValue = null; StringBuilder emitKey = null; Text kword = new Text(); Text vword = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] parts; String line = value.toString(); parts = line.split(" "); kword.set(parts[4].toString()); vword.set(line.toString()); context.write(kword, vword); } }

reduce的输入是这样的:
[key1]--> [value1, value2, ...]
[key2]--> [value1, value2, ...]
[key3]--> [value1, value2, ... .] 等等
我的兴趣是 [key2]--> [value1, value2, ...] 忽略其他键和相应的值。请帮我用减速机。

4

1 回答 1

1

UsingMultipleOutputs允许您在多个文件中发出记录,但仅在一组预定义数量/类型的文件中而不是任意数量的文件中,而不是根据键/值即时决定文件名。

您可以通过扩展来创建自己的 OutputFormat org.apache.hadoop.mapred.lib.MultipleTextOutputFormat。您的 OutputFormat 类应能够根据 reducer 发出的键/值来决定输出文件名和文件夹。这可以通过以下方式实现:

 package oddjob.hadoop;

 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

 public class MultipleTextOutputFormatByKey extends MultipleTextOutputFormat<Text, Text> {

        /**
        * Use they key as part of the path for the final output file.
        */
       @Override
       protected String generateFileNameForKeyValue(Text key, Text value, String leaf) {
             return new Path(key.toString(), leaf).toString();
       }

       /**
        * When actually writing the data, discard the key since it is already in
        * the file path.
        */
       @Override
       protected Text generateActualKey(Text key, Text value) {
             return null;
          }
 }

欲了解更多信息,请阅读此处

PS:您需要使用旧的mapredAPI 来实现。与较新的 API 一样,尚不支持MultipleTextOutput!参考这个

于 2013-03-11T18:42:08.943 回答