gpt4 book ai didi

hadoop - pig 镀金 : filtering records based on values in bag

转载 作者:可可西里 更新时间:2023-11-01 14:31:59 26 4
gpt4 key购买 nike

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

为了简单起见,我只使用了垃圾邮件/非垃圾邮件——这个字段的值通常是大约 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 条消息被删除 - 因为它们来自同一个用户/ session

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

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 为空)来获得非垃圾邮件发送者列表。

关于hadoop - pig 镀金 : filtering records based on values in bag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14780017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com