2013-02-08 150 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