Piglatin:基于价值观袋
问题描述:
我是一个新手,以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)}}
所有我需要的是转储从这一组,其中没有收入囊中的元素有一个“不垃圾邮件”类型元素的元素
答
你能想出这样的事情:
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为空),才可以选择非垃圾邮件发送者列表。
非常感谢您的解决方案 – rtuser 2013-02-14 07:08:32