地图中的键重新编号减少

时间:2013-05-07 16:39:20

标签: hadoop mapreduce

我是hadoop的新手,我正在使用一个程序,地图功能的输入是一个文件,键是这样的:

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

我的文件大约是10千兆字节,我想更改这些ID并按降序重新编号。我不想改变价值观。 我的输出必须是这样的:

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

我想在节点集群中完成这项工作?我怎么能这样做?

我认为我需要一个全局变量,我不能在群集中执行此操作?我该怎么办?

2 个答案:

答案 0 :(得分:1)

你可以做一个map / reduce命令id然后你有一个带有id的文件降序。

然后,您可以编写第二个map / reduce,将该文件与未分类的文件连接,映射器将在其中发出枚举器(可以通过分割大小计算以方便多个映射),以便映射器超过拳头文件将发出“1 sd”“2 g”等,处理ids文件的映射器将发出“1 5675”“2 68”。然后reducer将加入文件

这是一个(未经测试的)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';

答案 1 :(得分:0)

在我这样说之前,我喜欢Arnon使用hadoop的答案。

但是,由于这是一个小文件,10G不是那么大,你只需要运行一次,我个人只会写一个小脚本。

假设制表符分隔文件

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

这可能需要很长时间,肯定比使用hadoop更长,但很简单且有效