Piglatin:根据袋中的值过滤记录

时间:2013-02-08 19:33:22

标签: hadoop apache-pig

我是Piglatin的新手,我有一个看起来像这样的数据文件(消息,电子邮件,usersession,spamType)

为简单起见,我只使用垃圾邮件/非垃圾邮件 - 此字段的值通常为100种不同的变体

message1  user1@email  12345      spam
message2  user1@email  12345      spam
message3  user1@email  12345      not-spam

message10  user2@email  90879      not-spam
message11  user2@email  90879      not-spam

如果来自一个用户的任何一条消息被标记为垃圾邮件,我只需要 - 删除/过滤所有消息..所以上面的输出看起来像

message10  user2@email  90879      not-spam
message11  user2@email  90879      not-spam

其他3条消息被删除 - 因为它们来自同一个用户/会话

我正在尝试使用分组和嵌套来解决上述问题。任何帮助表示赞赏

DATA = LOAD './spamdata' using PigStorage() as (message:chararray, mailid:chararray,  session:long, spamType:chararray);
GDATA = GROUP DATA BY (mailid,session);

GDATA看起来像

GDATA: {group: (message: chararray,session: long),DATA: {(message: chararray,mailid: chararray,session: long,spamType: chararray)}}

我只需要从这个组中转储元素,其中包中的所有元素都没有“非垃圾邮件”类型的元素

1 个答案:

答案 0 :(得分:3)

你可以想出这样的东西:

DATA = LOAD....;
S =  FOREACH (FILTER DATA BY spamType == 'spam') GENERATE mailid, session;
SPAM = DISTINCT S;
JOINED = JOIN DATA BY (mailid, session) LEFT OUTER, SPAM BY (mailid, session);

RES = FOREACH (FILTER JOINED by SPAM::mailid is null)
  GENERATE $0 AS message, $1 AS mailid, $2 AS session, $3 AS spamType;

dump RES;

这里的想法是首先确定那些垃圾邮件发送者的用户。在原始数据集上对此数据执行左连接之后,我们可以通过选择那些没有正确表匹配的行(例如:SPAM :: mailid为null)来获得非垃圾邮件发送者列表。