3

我是 Piglatin 的新手,我有一个看起来像这样的数据文件(消息、电子邮件、用户会话、垃圾邮件类型)

为了简单起见,我只使用了垃圾邮件/非垃圾邮件-该字段的值通常是大约 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)}}

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

4

1 回答 1

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 为空)。

于 2013-02-12T15:24:18.293 回答