2013-04-03 2 views
1

У меня есть два комплектаМогу ли я сохранить несоответствующие элементы из собрания в Pig?

personCounts 
(personName:chararray, count:int) 

whitelist 
(empID:int, empName:chararray) 

То, что я хочу, это люди, которые находятся в personCounts, но не в белом списке. Я знаю, что JOIN возвращает элементы, которые появляются в обоих. Есть ли способ вернуть те, которые будут отброшены вместо этого? Я думал, что смогу сделать это с помощью CROSS, но тогда у меня были бы дополнительные дополнения, я думаю ...?

crossed = CROSS personCounts BY personName, whitelist BY empName; 
filcrs = FILTER crossed BY NOT personCounts::personName MATCHES whitelist::empName; 

ответ

2

Вы можете сделать это с ПРИСОЕДИНЯЕМОЙ ПОЛНОСТЬЮ.

joined = JOIN personCounts BY personName FULL, whitetlist BY empName; 
joined = FILTER joined BY NOT $0 MATCHES ''; 
joined = FILTER joined BY $3 IS null; 

Затем вступил в (PERSONNAME, граф, '')

2

Я думаю, что вы хотите достичь заданной разницы между personCounts и whitelist правильно?

Если да, то попробуйте следующее (не тестировалось !!!):

CGRP = COGROUP personCounts BY personName, whitelist BY empName; 
PC_MINUS_WL = FILTER CGRP BY IsEmpty(whitelist); 
PC_MINUS_WL = FOREACH PC_MINUS_WL GENERATE group AS name; 

Я нашел две следующие полезные ресурсы:

http://agiletesting.blogspot.de/2012/02/set-operations-in-apache-pig.html

http://www.cs.tufts.edu/comp/150CPA/notes/Advanced_Pig.pdf

+0

Большие ресурсы, спасибо! –