有没有办法在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)来自哪个文件。我在这里忽略了一些简单的事情吗?
非常感谢。
答案 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();