与Map-Reduce合并。一个数据集中的多个键

时间:2013-07-03 17:21:51

标签: hadoop merge mapreduce hadoop-streaming

我有两个数据集:

Dataset1:

Emp1 Emp2 Salary



Dataset2

Emp add1 add2 add3

数据集2中的数据由数据集1中Emp1或Emp2中存在的所有员工组成。

结果数据集需要具有雇员emp1和emp2的每一行Dataset1和add1 add2 add3变量。

Dataset3

Emp1 Emp2 add1(emp1) add2(emp1)  add3(emp1) add1(emp2) add2(emp2)  add3(emp2)

它基本上是对2个数据集的合并,但是当我尝试从第一个数据集中获取密钥时,我可以在一列中获得Emp1 Emp2并且可以在另一列中获得Emp1 Emp3。如何使用map reduce来实现这一点,因为密钥会变得混乱?

1 个答案:

答案 0 :(得分:0)

如果您想实现“合并MR作业”,您必须注意要合并的数据记录到达同一Reducer。因此,Mappers必须使用适当的Key发出这些单个记录(也称为键值对)。我建议 implement your own key class

您的密钥可以命名为“TwoEmployees”或“EmployeePair”左右。在每种情况下,作为MR密钥,它必须实施WritableComparable 。然后它应该有两个字段emp1emp2

Mapase of Dataset1将发出键值对,其中键包含两个员工,值包含薪水。
Mappers of Dataset2将发出键值对,其中只在键中设置了emp1,值是一个携带所有地址信息的复杂对象。

现在让这些不同的键值对转到同一个reducer的魔力是compareTo()类中实现key - 方法的方式(“A。Anderson”,“B。Bakeman”)等于(“B. Bakeman”,null)并且等于(“A. Anderson”,null)。

现在,您的reducer将从dataset1接收一条记录,从dataset2接收两条记录。它可以将合并记录作为最终键值对发出。