我是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)}}
我只需要从这个组中转储元素,其中包中的所有元素都没有“非垃圾邮件”类型的元素
答案 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)来获得非垃圾邮件发送者列表。