我是hadoop的新手,我正在使用一个程序,地图功能的输入是一个文件,键是这样的:
ID: value:
3 sd
37 g
5675 gk
68 oi
我的文件大约是10千兆字节,我想更改这些ID并按降序重新编号。我不想改变价值观。 我的输出必须是这样的:
ID: value:
5675 sd
68 g
37 gk
3 oi
我想在节点集群中完成这项工作?我怎么能这样做?
我认为我需要一个全局变量,我不能在群集中执行此操作?我该怎么办?
答案 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更长,但很简单且有效