在Hadoop的MapReduce中使用关系名称/表名/文件名

时间:2011-01-19 20:50:27

标签: hadoop mapreduce

有没有办法在MapReduce的Map和Reduce中使用关系名称?我正在尝试使用Hadoop的MapReduce来设置差异。

输入: 2个文件R和S包含术语列表。 (我会用t来表示一个术语)

目标:找到R - S,即R中的项而不是S

方法

Mapper:吐出t - > R或t - > S,取决于t是来自R还是S.因此,地图输出以t为键,文件名为值。

Reducer:如果t的值列表仅包含R,则输出t - >吨。

我是否需要使用文件名标记条款?或者还有其他方法吗?

我为Set Union所做的事情的源代码(在这种情况下不需要文件名)。只是想以此为例来说明Mapper中文件名不可用。

public class Union {
        public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> {

                public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException {
                        output.collect(value, value);
                }
        }

        public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> {

                public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException{
                        while (values.hasNext())
                        {
                                output.collect(key, values.next());
                                break;
                        }
                }
        }

        public static void main(String[] args) throws Exception {
                JobConf conf = new JobConf(Union.class);
                conf.setJobName("Union");
                conf.setOutputKeyClass(Text.class);
                conf.setOutputValueClass(Text.class);

                conf.setMapperClass(Map.class);
                conf.setCombinerClass(Reduce.class);
                conf.setReducerClass(Reduce.class);
                conf.set("mapred.job.queue.name", "myQueue");
                conf.setNumReduceTasks(5);

                conf.setInputFormat(TextInputFormat.class);
                conf.setOutputFormat(TextOutputFormat.class);

                FileInputFormat.setInputPaths(conf, new Path(args[0]));
                FileOutputFormat.setOutputPath(conf, new Path(args[1]));

                JobClient.runJob(conf);
        }
}

如您所见,我无法识别哪个键 - &gt;值对(输入到Mapper)来自哪个文件。我在这里忽略了一些简单的事情吗?

非常感谢。

1 个答案:

答案 0 :(得分:3)

我会像你回答的那样实施你的问题。这就是MapReduce的方式。
我想你的问题实际上是在HDFS中写入n次相同的值?

修改 从我的评论中粘贴

啊,我明白了;)我对“旧”API并不熟悉,但您可以“查询”您的记者:

reporter.getInputSplit();

这会返回一个名为InputSplit的接口。这很容易转换为“FileSplit”。在FileSplit对象中,您可以获取Path:“split.getPath()”。从Path对象中,您只需要调用getName()方法。

所以这段代码应该适合你:

FileSplit fsplit = reporter.getInputSplit(); // maybe cast it down to FileSplit if needed..
String yourFileName = fsplit.getPath().getName();