Удаление дубликатов с помощью 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);
};

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


person Anil Savaliya    schedule 14.08.2015    source источник


Ответы (2)


@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)
person Murali Rao    schedule 14.08.2015
comment
Прохладный! Это идеальное решение. Спасибо за ответ. - person Anil Savaliya; 17.08.2015

Хорошо .. Вы можете использовать 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.

person Surender Raja    schedule 14.08.2015