我有很多Mappers& amp; Reducers,在某些时候我需要先前map-reduce步骤的合并结果,例如作为输入我有两个带数据的文件:
/input/a.txt
apple,10
orange,20
*/input/b.txt*
apple;5
orange;40
结果应为c.txt,其中<strong> c.value = a.value * b.value
/output/c.txt
apple,50 // 10 * 5
orange,800 // 40 * 20
怎么做?我已经通过引入简单的Key =&gt;解决了这个问题。 MyMapWritable(type = 1,2,value),以及reducers中的合并(实际上,乘法)数据。它有效,但是:
答案 0 :(得分:3)
假设它们已经以相同的方式进行了分区和排序,那么您可以使用CompositeInputFormat来执行map-side-join。有一篇关于使用它的文章here。我不认为它已被移植到新的mapreduce api中。
其次,您可以通过调用context.getInputSplit()
来获取映射器中的输入文件,这将返回InputSplit,如果您使用的是TextInputFormat
,则可以转换为FileInputSplit
然后调用getPath()
获取文件名。我不认为你可以在CompositeInputFormat中使用这个方法,因为你不知道TupleWritable中Writables的来源。
答案 1 :(得分:1)
String fileName = ((FileSplit) context.getInputSplit()).getPath()
.toString();
if (fileName.contains("file_1")) {
//TODO for file 1
} else {
//TODO for file 2
}