2013-05-07 46 views
0

我在Hadoop的新的,我有一個程序工作的那個地圖功能的輸入是一個文件,關鍵是這樣的:重點重新編號減少

ID:  value: 
3   sd 
37   g 
5675  gk 
68   oi 

我的文件大約10千兆字節,我想要更改這些ID並按降序重新編號。我不想改變這些值。 我的輸出必須是這樣的:

ID:  value: 
5675   sd 
68   g 
37   gk 
3   oi 

我想做這個工作節點的集羣?我怎樣才能做到這一點?

我認爲我需要一個全局變量,我不能在集羣中做到這一點?我能做什麼?

+0

這是你會做多次的過程?或者這是一筆一筆交易? – greedybuddha 2013-05-07 18:04:31

+0

@greedybuddha:我必須做一次。 – user1878364 2013-05-07 18:18:53

回答

1

你可以做一個map/reduce來訂購id,然後你會得到一個帶有id的文件,按降序排列。

然後,您可以編寫第二個map/reduce,將該文件與未排序的文件加入,映射器將在其中映射器發出枚舉器(可通過拆分大小計算以便於多個映射),以便映射器遍歷第一個文件會發出「1 sd」「2 g」等,處理該ids文件的映射器會發出「1 5675」「2 68」。然後減速將加入文件

這裏是一個(未經測試)pig 0.11腳本,將沿着這些線路做一些事情:

A = load 'data' AS (id:chararray,value:chararray); 
ID_RAW= FOREACH A GENERATE id; 
DATA_RAW = FOREACH A GENERATE value; 
ID_SORT= RANK ID_RAW BY id DESC DENSE; 
DATA_SORT = RANK DATA_RAW DENSE; 
ID_DATA = JOIN ID_SORT by $0, DATA_SORT by $0; 
RESULT = FOREACH ID_DATA GENERATE ID_SORT::ID,DATA_SORT::value; 
STORE RESULT to 'output'; 
0

我說在這之前,我喜歡嫩對使用Hadoop的答案。

但是,由於這是一個小文件,10G並不是那麼大,你只需要運行一次,我個人只會寫一個小腳本。

假設製表符分隔的文件

sort myfile.txt > myfile.sorted.text 
paste myfile.sorted.text myfile.text | cut -f1,4 > newFile.txt 

這可能需要很長的時間,肯定長於使用Hadoop,但簡單和工程