Pig拉丁问题

ifmq2ha2  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(218)

请帮帮我…真的很紧急…期限快到了,我坚持了两个星期…打破了我的头,但没有结果。我是一个学拉丁语的新手。我有一个场景,我必须从csv文件中过滤数据。csv在hdfs上,有两列。

grunt>> fl = load '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray);
grunt>> dump f1;
("first~584544fddf~dssfdf","2001")
("first~4332990~fgdfs4s","2001")
("second~232434334~fgvfd4","1000")
("second~786765~dgbhgdf","1000)
("second~345643~gfdgd43","1000")

我需要做的是只提取第一个“~”符号前的第一个单词,并将其与csv文件的第二列值合并。我还需要对返回的连接结果进行分组,计算类似行的数量,并创建一个新的csv文件作为output,其中将再次有2列。第一列将是串联的值,第二列将是行计数。即

("first 2001","2")
("second 1000","3")

等等。
我已经在这里写了代码,但它只是不工作。我用过strsplit。它正在拆分输入csv文件的第一列的值。但是我不知道如何提取第一个分割值。代码如下:

convData = LOAD '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray);

fil = FILTER convData BY conv != '"-1"'; --im using this to filter out the rows that has 1st column as "-1".

data = FOREACH fil GENERATE STRSPLIT($0, '~');

X = FOREACH data GENERATE CONCAT(data.$0,' ',convData.clnt);

Y = FOREACH X GROUP BY X;

Z = FOREACH Y GENERATE COUNT(Y);

var = FOREACH Z GENERATE CONCAT(Y,',',Z);

STORE var INTO '/user/hduser/output.csv' USING PigStorage(',');
4c8rllxm

4c8rllxm1#

STRSPLIT 返回一个元组,可以使用编号语法访问其中的各个元素。这就是你需要的:

data = FOREACH fil GENERATE STRSPLIT($0, '~') AS a, clnt;
X = FOREACH data GENERATE CONCAT(a.$0,' ', clnt);

相关问题