У меня есть две версии (старые/новые) таблицы базы данных с около 100 000 000 записей. Они находятся в файлах:Mapreduce Table Diff
trx-old
trx-new
Структура:
id date amount memo
1 5/1 100 slacks
2 5/1 50 wine
идентификатор простой первичный ключ, остальные поля не являются ключевыми. Я хочу сгенерировать три файла:
trx-removed (ids of records present in trx-old but not in trx-new)
trx-added (records from trx-new whose ids are not present in trx-old)
trx-changed (records from trx-new whose non-key values have changed since trx-old)
Мне нужно сделать эту операцию каждый день в коротком окне партии. И на самом деле, мне нужно сделать это для нескольких таблиц и нескольких схем (создавая три файла для каждого), поэтому фактическое приложение немного более активно. Но я думаю, что этот пример отражает суть проблемы.
Это похоже на очевидное приложение для mapreduce. Я никогда не писал приложение mapreduce, у меня есть следующие вопросы:
- Есть ли какое-то приложение EMR, которое уже делает это?
- Есть ли очевидное решение Pig или Cascading?
- есть ли какой-нибудь другой пример с открытым исходным кодом, который очень близок к этому?
PS Я видел вопрос diff between tables, но решения там не выглядели масштабируемыми.
PPS Вот маленький рубин игрушка, которая демонстрирует алгоритм: Ruby dbdiff
2. Да, решение Pig по крайней мере для добавленных и удаленных частей является явно очевидным «LEFT OUTER JOIN» и «FILTER» на основе того, является ли объединенный столбец «нулевым». Что касается «измененного», то моя лучшая догадка - это внутренний 'JOIN' и фильтр, основанный на том, отличаются ли поля. – TC1