我有一个链接很多映射器和缩减器的工具,在某些时候我需要合并之前映射缩减步骤的结果,例如作为输入,我有两个包含数据的文件:
/input/a.txt
apple,10
orange,20
*/input/b.txt*
apple;5
orange;40
结果应该是 c.txt,其中c.值 = a.值 * b.值
/output/c.txt
apple,50 // 10 * 5
orange,800 // 40 * 20
怎么办呢?我通过引入简单的 Key => MyMapWritable (type=1,2, value) 并在化简器中合并(实际上是相乘)数据来解决这个问题。它有效,但是:
- 感觉可以更容易完成(气味不好)
- 是否有可能以某种方式在 Mapper 内部知道哪个文件被用作记录提供者(a.txt 或 b.txt)。现在,我只是使用了不同的分隔符:逗号和分号:(
假设它们已经以相同的方式分区和排序,那么您可以使用复合输入格式 http://hadoop.apache.org/common/docs/r1.0.3/api/org/apache/hadoop/mapred/join/CompositeInputFormat.html执行映射端连接。有一篇文章介绍它的使用here http://www.congiu.com/joins-in-hadoop-using-compositeinputformat/。我认为它还没有被移植到新的 mapreduce api 中。
其次,您可以通过调用获取映射器中的输入文件context.getInputSplit()
,这将返回 InputSplit,如果您使用的是TextInputFormat
,您可以投射到FileInputSplit
然后打电话getPath()
获取文件名。我认为您不能将此方法与 CompositeInputFormat 一起使用,因为您不知道 TupleWritable 中的 Writables 来自哪里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)