java - 如何在同一输入上运行两个不同的映射器,并将其输出发送到单个reducer?

标签 java hadoop join mapreduce

我有一些航类数据(每行包含起点,目的地,航类号等),我需要对其进行处理以在所有起点和目的地之间输出航类详细信息,其中一个停留点为,我的想法是拥有两个映射器(一个输出目的地) (作为键,其他输出作为键),因此 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/

相关文章:

JavaFX FXML - 带有图标和文本的按钮

java - 即使使用 session.load(),Hibernate 也会忽略 @Fetch(FetchMode.JOIN)

hadoop - 将文件夹从LocalSystem加载到HDFS

mysql - Left Join 基于字段值

java - 使用 Mockito 的 When 方法发出问题

java - 在 EditText 中将字符串转换为 double

hadoop - hadoop错误:util.NativeCodeLoader(hdfs dfs -ls不起作用!)

amazon-s3 - 如何将文件从 S3 复制到 Amazon EMR HDFS?

mysql - 对多列求和 - 意外结果

mysql - SQL 使用 JOIN 查询多个表 - Northwind