2015-08-14 4 views
1

Я использую PigLatin. И я хочу удалить дубликаты из сумок и хочу сохранить последний элемент конкретного ключа.Удаление дубликатов с использованием PigLatin и сохранение последнего элемента

Input: 
User1 7 LA 
User1 8 NYC 
User1 9 NYC 
User2 3 NYC 
User2 4 DC 


Output: 
User1 9 NYC 
User2 4 DC 

Здесь первая подана ключ. И я хочу, чтобы последняя запись этого конкретного ключа была сохранена на выходе.

Я знаю, как сохранить первый элемент. Это как показано ниже. Но не удалось сохранить последний элемент.

inpt = load '......' ......; 
user_grp = GROUP inpt BY $0; 
filtered = FOREACH user_grp { 
     top_rec = LIMIT inpt 1; 
     GENERATE FLATTEN(top_rec); 
}; 

Может ли кто-нибудь помочь мне в этом? Заранее спасибо!

ответ

5

@Anil: Если вы заказываете на одном из полей в порядке убывания. Вы сможете получить последнюю запись. В приведенном ниже коде, которые отсортированы по второму полю входного (имя поля: нет в сценарии)

Входной сигнал:

User1,7,LA 
User1,8,NYC 
User1,9,NYC 
User2,3,NYC 
User2,4,DC 

Свиньи фрагмент:

user_details = LOAD 'user_details.csv' USING PigStorage(',') AS (user_name:chararray,no:long,city:chararray); 

user_details_grp_user = GROUP user_details BY user_name; 

required_user_details = FOREACH user_details_grp_user { 
    user_details_sorted_by_no = ORDER user_details BY no DESC; 
    top_record = LIMIT user_details_sorted_by_no 1; 
    GENERATE FLATTEN(top_record); 
} 

Выход: DUMP required_user_details

(User1,9,NYC) 
(User2,4,DC) 
+1

Nice Approach .. –

+0

Прохладный! Это идеальное решение. Спасибо за ответ. –

0

ОК .. Вы можете использовать RANK Operator.

Надеюсь, что этот код поможет.

rec = LOAD '/user/cloudera/inputfiles/sample.txt' USING PigStorage(',') AS(user:chararray,no:int,loc:chararray); 
rec_rank = rank rec;                      
rec_rank_each = FOREACH rec_rank GENERATE $0 as rank_key, user, no, loc;         
rec_rank_grp = GROUP rec_rank_each by user; 
rec_rank_max = FOREACH rec_rank_grp GENERATE group as temp_user, MAX(rec_rank_each.rank_key) as max_rank; 
rec_join = JOIN rec_rank_each BY (user,rank_key) , rec_rank_min BY(temp_user,max_rank); 
rec_output = FOREACH rec_join GENERATE user,no,loc; 
dump rec_output; 

Убедитесь, что вы запускаете это от свиньи 0.11 версии в качестве ранга оператора, введенного из чугуна 0,11

Смежные вопросы