【问题标题】:Pig Latin issue猪拉丁问题
【发布时间】:2013-04-04 16:20:29
【问题描述】:

请帮帮我..它真的很紧急..截止日期临近,我坚持了 2 周..打破了我的头,但没有结果。我是piglatin的新手。 我有一个场景,我必须从 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(',');

【问题讨论】:

  • 顺便说一句,我不建议在帮助论坛上强调某些事情的紧迫性——如果你把问题写得好,你会在这里得到快速的帮助。请注意,如果看到此内容,有些人会投反对票,因为提供的所有帮助都由志愿者 :) 闲暇时提供。

标签: hadoop apache-pig


【解决方案1】:

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

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

【讨论】:

  • 认为您需要将 , c1nt 添加到第一行的末尾并将 CONCAT 更改为 CONCAT(a.$0,' ',clnt);因为 convData 不是数据别名的一部分。
  • 你说得对,我只是从问题中抄来的,没有仔细阅读。
  • 另外,STRSPLIT($0, '~',2) 会更有效,因为您实际上只需要第一个 ~ 之前和之后的所有内容。这也可以让他定义数据模式,因为现在 STRSPLIT 返回一个固定长度的 2 个字符数组的元组......我尽量在 pig 中只使用强类型模式......否则我发现自己遇到了难以调试的问题问题。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多