我有一些航类数据(每行包含起点,目的地,航类号等),我需要对其进行处理以在所有起点和目的地之间输出航类详细信息,其中一个停留点为,我的想法是拥有两个映射器(一个输出目的地) (作为键,其他输出作为键),因此 reducer 将中途停留位置作为键,并将所有起点和终点作为值的数组)。然后,我可以输出 reducer 中所有位置的一个中途停留的航类详细信息。
所以我的问题是如何在同一个输入文件上运行两个不同的映射器,并将它们的输出发送到一个reducer。
我读到有关MultipleInputs.addInputPath
的信息,但是我猜想它需要输入不同(或者至少两个相同输入的副本)。
我正在考虑使用工作流独立运行两个映射器作业,然后使用第三个Identity映射器和reducer来执行飞行计算。
有没有更好的解决方案呢? (请不要要求我使用Hive,现在还不满意)。有关使用mapreduce实现的任何指导确实会有所帮助。谢谢。
最佳答案
我认为您只需一个Mapper就可以做到。
映射器两次发出每个(src,dst,fno,...)
输入记录,一次作为(src,(src,dst,fno,...))
,一次作为(dst,(src,dst,fno,...))
。
在Reducer中,您需要为每个记录找出其键是源还是目标,然后执行停靠联接。使用标志来指示键的作用和辅助排序可以使此操作更加有效。
这样一来,只需一个MR工作和一个Mapper和一个Reducer就可以完成该任务。
关于java - 如何在同一输入上运行两个不同的映射器,并将其输出发送到单个reducer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330964/