2013-07-03 27 views
2

多鍵我有兩個數據集:與Map-Reduce合併。在一個數據集

Dataset1: 

Emp1 Emp2 Salary 



Dataset2 

Emp add1 add2 add3 

的數據在數據集2由存在於EMP1或EMP2在數據集1中的所有員工。

生成的數據集需要擁有employess 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

你可以做兩輪MapReduce嗎?在第一輪中,只需處理emp1。在第二輪中,完成emp2。 – zsxwing

+0

我不知道我是否理解正確,但基本上,您有Dataset1,其中包含員工名單和他們的薪水;一個Dataset2包含所有員工的增量?你想要獲得的是「每位員工的最終薪水」? –

+0

您可以在數據集1,數據集2和數據集3中添加更多行,並告訴我們Hadoop如何與密鑰混淆? –

回答

0

如果要實現「合併MR作業」,則必須注意應合併的數據記錄到達相同的Reducer。因此,您的Mappers必須用適當的Key發出這些單個記錄(又名鍵值對)。我建議implement your own key class

您的密鑰可以命名爲「TwoEmployees」或「EmployeePair」左右。在任何情況下,作爲MR密鑰,它必須執行WritableComparable。那麼它應該有兩個字段emp1emp2

數據集1的映射器將發出鍵值對,其中鍵包含兩個員工,並且該值包含薪水。
映射器的數據集2將發出鍵值對,其中只有emp1被設置在鍵中,並且該值是一個攜帶所有地址信息的複雜對象。

現在的魔法使這些不同的鍵 - 值對去同一個減速器是實現在keycompareTo() - 方法的方式(「A.安徒生」,「B Bakeman」 )等於(「B. Bakeman」,null),也等於(「A. Anderson」,null)。

現在您的reducer將從dataset1接收一條記錄,並從dataset2接收兩條記錄。它可以發出合併記錄作爲最終的鍵值對。