请帮帮我..真的很紧急。接近,并且我坚持了2周以来......我的脑袋却没有结果。我是一个小猪的新手。 我有一个场景,我必须从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文件作为输出,其中将再次有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(',');
答案 0 :(得分:1)
STRSPLIT
返回一个元组,您可以使用编号语法访问其中的各个元素。这就是你需要的:
data = FOREACH fil GENERATE STRSPLIT($0, '~') AS a, clnt;
X = FOREACH data GENERATE CONCAT(a.$0,' ', clnt);