2013-02-08 3 views
3

에 값을 기준으로 필터링 기록, 난 내가 사용하고있는 단순성을 위해서 다음과 같습니다 데이터 파일 (메시지, 이메일, 사용자 세션, spamType)Piglatin : 나는 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 
처럼 보입니다. 그들은 내가 그룹화를 사용하여 위의를 해결하기 위해 노력하고 동일한 사용자/세션

에서하기 때문에하고 .. 어떤 도움을 중첩

DATA = LOAD './spamdata' using PigStorage() as (message:chararray, mailid:chararray, session:long, spamType:chararray); 
GDATA = GROUP DATA BY (mailid,session); 

GDATA의 외모를 평가 -210

다른 3 메시지가 제거됩니다

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가 null) 만 선택하여 비 스팸 발송자 목록을 만들 수 있습니다.

+0

해결해 주셔서 감사합니다. – rtuser