Обработка обновленных записей в Hadoop

Каждый день пользовательская таблица из оракула сбрасывается в HDFS. Дамп содержит только последние изменения (вставки и обновления), которые были сделаны после предыдущего дампа. Теперь я хотел загрузить все ежедневные дампы, используя PIG, в отношение и соединить его с файлом транзакции, используя поле «userid». Проблема с обновленными записями. Один и тот же пользователь может иметь несколько записей. Я хочу использовать только самую последнюю запись пользователя при присоединении. Как мы можем это сделать. Любая помощь приветствуется. Спасибо.


person rahul    schedule 26.04.2013    source источник


Ответы (1)


Вам нужно сгруппировать файл обновлений, упорядочить его по дате и выбрать первый, а затем присоединиться к нему. Что-то вроде приведенного ниже кода должно предоставить вам самое последнее обновление.

A = LOAD 'user_updates'...;
A_Users = GROUP A BY user_id;
A_TOP = FOREACH A_Users {
  sorted = ORDER A BY update_time DESC;
  top_one = LIMIT sorted 1;
  GENERATE top_one;
};
person Arnon Rotem-Gal-Oz    schedule 26.04.2013
comment
Спасибо за ваш ответ. Вместо того, чтобы делать это каждый раз, есть ли постепенный способ сделать это? Это может создать проблему, когда набор данных становится очень большим. Есть ли лучший способ сделать это, чем тот, который упомянут в этой ссылке grokbase.com/t/hive/user/10688hfg6z/ - person rahul; 28.04.2013
comment
поскольку таблица обновлений небольшая, вы можете выполнить реплицированное соединение, чтобы меньшая таблица была скопирована, а большая не перемещалась, см. pig.apache.org/docs/r0.11.0/perf.html#Specialized-Joins - person Arnon Rotem-Gal-Oz; 28.04.2013
comment
Другим способом было бы сохранить его в HBase, который поддерживает случайное чтение-запись (т.е. вы можете обновить определенные записи, которые были изменены). - person Arnon Rotem-Gal-Oz; 28.04.2013
comment
Спасибо. Попробую реплицированное соединение - person rahul; 28.04.2013