2013-05-07 45 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,但简单和工程