0

我是hadoop的新手,我正在使用一个程序,map函数的输入是一个文件,键是这样的:

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

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

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

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

我认为我需要一个全局变量,而我不能在集群中执行此操作?我能做些什么?

4

2 回答 2

1

您可以执行一个 map/reduce 来对 id 进行排序,然后您将拥有一个 id 降序排列的文件。

然后,您可以编写第二个 map/reduce 将该文件与未排序文件连接起来,其中映射器将发出枚举器(可以通过拆分大小计算以促进多个映射),以便遍历第一个文件的映射器将发出“1 sd”“2 g”等,处理 ids 文件的映射器将发出“1 5675”“2 68”。然后reducer将加入文件

这是一个(未经测试的)猪 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';
于 2013-05-07T18:20:32.597 回答
0

在我说这个之前,我喜欢 Arnon 对使用 hadoop 的回答。

不过因为这是小文件,10G也不算大,运行一次就行了,我个人会写一个小脚本。

假设一个制表符分隔的文件

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

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

于 2013-05-07T21:16:22.243 回答