2013-02-08 128 views
3

我是一个新手,以Piglatin筛选记录,我有一个数据文件,它看起来像这样(的消息,电子邮件,usersession,spamType)Piglatin:基于价值观袋

为了简单起见,我有我已经使用只是垃圾邮件/非垃圾邮件 - 这个字段的值通常是一些100种不同的变种

message1 [email protected] 12345  spam 
message2 [email protected] 12345  spam 
message3 [email protected] 12345  not-spam 

message10 [email protected] 90879  not-spam 
message11 [email protected] 90879  not-spam 

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

message10 [email protected] 90879  not-spam 
message11 [email protected] 90879  not-spam 

其他3条消息被删除 - 由于它们是从同一个用户/会话

我试图解决上述使用分组和嵌套的for ..任何帮助理解

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)}} 

所有我需要的是转储从这一组,其中没有收入囊中的元素有一个“不垃圾邮件”类型元素的元素

回答

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为空),才可以选择非垃圾邮件发送者列表。

+0

非常感谢您的解决方案 – rtuser 2013-02-14 07:08:32