Hadoop - 这些输入文件之间的多个输入和连接

时间:2014-05-20 14:15:02

标签: java hadoop mapreduce cluster-computing

我想在多个文件(实际上是2个文件)上使用Hadoop作为输入文件。

例如:

文件输入1:

user1 italy
user2 spain
user3 italy
...

文件输入2:

user1 trackname1
user2 trackname2
user3 trackname1
...

我需要每个国家/地区的用户数量,然后是每个国家/地区最受欢迎的曲目(文件2)。最后是最流行音乐的出现次数。

我想要输出,例如:

Popular track (italy):
trackname1 (occurrences)

Popular track (spain):
trackname2

...

实际上我试过使用2个映射器和1个减速器。但我不知道如何在用户字段上的两个输入文件之间进行“连接”。什么是最好的解决方案?

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你需要连续三个工作岗位(也许我会使用太多工作,但这会给你直觉,你可以稍后优化它):

  • 作业1 (加入)

    • file1的地图
      输出:用户ID 输出:country(您可以设置一个特殊的前缀来表示它是一个国家而不是一个曲目)

    • file2的地图
      输出:用户ID 输出:track

    • 缩小(用户ID,< country,track>)
      输出 :(国家/地区)
      输出:1

  • 工作2 (计算)

    • 地图:身份映射器
    • 减少(国家/地区,< 1,1,1,...>)
      总结每个(国家轨道)的1 输出:国家
      输出 :(跟踪,计数)对

  • 作业3 (排序)

    • 地图:身份映射器
    • 减少
      保持最大计数和输出的轨道值:
      输出键:国家
      输出值:跟踪

作业2和3可以使用与其缩减器类似(但不完全相同)的组合器。我再说一遍,这不是最好的解决方案,可以做很多工作来优化它(特别是工作2和3)。例如,您可以从作业1输出一个国家/地区作为键,将(轨道,1)作为值输出,然后在作业2处完成。