我有两个数据集:
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来实现这一点,因为密钥会变得混乱?
答案 0 :(得分:0)
如果您想实现“合并MR作业”,您必须注意要合并的数据记录到达同一Reducer
。因此,Mappers
必须使用适当的Key
发出这些单个记录(也称为键值对)。我建议 implement your own key class。
您的密钥可以命名为“TwoEmployees”或“EmployeePair”左右。在每种情况下,作为MR密钥,它必须实施WritableComparable 。然后它应该有两个字段emp1
和emp2
。
Mapase of Dataset1将发出键值对,其中键包含两个员工,值包含薪水。
Mappers of Dataset2将发出键值对,其中只在键中设置了emp1,值是一个携带所有地址信息的复杂对象。
现在让这些不同的键值对转到同一个reducer的魔力是在compareTo()
类中实现key
- 方法的方式(“A。Anderson”,“B。Bakeman”)等于(“B. Bakeman”,null)并且等于(“A. Anderson”,null)。
现在,您的reducer将从dataset1接收一条记录,从dataset2接收两条记录。它可以将合并记录作为最终键值对发出。