2013-09-30 71 views
1

使用Hadoop我想加入兩個具有相同記錄數但不攜帶行號的文件。例如A.TXT加入兩個沒有密鑰的等值數據集

a xx 
b y 
c z 

和B.txt

1 r 
2 s 
3 d 

加入後,我需要有

a xx 1 r 
b y 2 s 
3 d c z 

這是督察完美的一面由端串聯。我無法弄清楚如何在Hadoop中做到這一點,我相信我需要在這兩個文件上初始傳遞以追加行號?

利用豬的答案,和/或地圖/減少技巧的各種組合都很好。

回答

1

這篇文章給你一個提示:SO POST about special input format

而不是給字節偏移輸入格式可以生產線號爲重點。這樣,您可以簡單地使用單位映射器(只發出關鍵值)並在reducer中進行連接。這看起來很難,但它只是在輸入格式中覆蓋了幾個函數,並且你完成了。

0

我覺得這兩個文件都記錄數量相等,所以你可以做以下只用一個通(一個地圖降低作業)的加入: -

  1. 您可以在這兩個文件加載到兩個不同的臨時表。
  2. 現在,您可以在Hive中創建一個UDF來生成行號(比如說從1開始),並從Hive臨時表中選擇字段來創建包含三列的最終表格,即額外列將包含行號。
  3. 現在您可以使用行號加入兩個最終表格。

希望這可以幫助你的事業。

1

這應該在豬的工作:

A = load 'A.txt'; 
B = load 'B.txt'; 

rankedA = RANK A; 
joined = JOIN rankedA BY $0, B BY $0; 

然後可以進一步與FOREACH語句重新排序列,如果你想。