2013-09-26 3 views
0

Я использую Spring Batch для извлечения-преобразования-массива массированных онлайн-данных в хранилище данных для анализа рекомендаций. Оба являются РСУБД.Лучшая практика использования ETL с использованием Spring Batch?

Мой вопрос в том, что является лучшей практикой для автономного Spring Batch ETL? Полная загрузка или добавочная нагрузка? Я предпочитаю полную загрузку, потому что это проще. В настоящее время я использую эти шаги для задания загрузки данных:

step1: обрезать таблицу A в хранилище данных;
step2: загрузить данные в таблицу A;
step3: обрезать таблицу B в хранилище данных;
step4: загрузить данные в таблицу B;
step5: обрезать таблицу C в хранилище данных;
step6: загрузить данные в таблицу C;
...

эти таблицы A, B, C ... в хранилище данных используются в режиме реального времени обработки системы рекомендаций.

Но так как данные, которые я загружаю из онлайн-бара, массивны, вся обработка работы будет очень трудоемкой. Поэтому, если я усекаю таблицу и еще не загружал данные, обработка рекомендаций в режиме реального времени, основанная на этой таблице, будет иметь большую проблему. Как я могу предотвратить эту неполноту данных? Использование Staging Table или какой-либо стратегии?

Любой ответ будет очень благодарен.

+1

Это не вопрос весенней партии; это просто проблема с дизайном ETL. – Ickster

+0

Спасибо за ваше напоминание. Я изменил теги. – Wuaner

ответ

0

У вас есть несколько вариантов:

  • Используйте журнал аудита исходных таблиц, чтобы определить, какие должны быть обновлены в целевой записи. Это лучший вариант для пакетного ETL, но для этого требуется наличие аудита в исходной системе. Если у вас есть возможность включить аудит, и это не будет проблемой производительности, это путь.

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

    В зависимости от целевого механизма базы данных у вас будут разные варианты выполнения обновлений. Некоторые могут потребовать, чтобы вы попытались выполнить попытку записи (либо вставку, либо обновление); если это не удается, вы должны поймать исключение и выполнить другую запись. (Например, попытайтесь вставить.Если вы поймаете DuplicateKeyException, тогда вам нужно сделать обновление. В зависимости от соотношения вставок к обновлениям вы можете отменить порядок вставки/обновления для обновления/вставки).

    Другие двигатели позволяют MERGE, что позволяет обновлять/вставлять/удалять за один шаг.

    Этот подход все еще перемещает много данных, но будет иметь минимальное воздействие на цель. Это предполагает, конечно, что вы можете заказать обновления таблиц таким образом, чтобы у вас не было проблем с ссылочной целостностью. пишите в цель при чтении.

+0

Спасибо за ответ. Я буду помнить об этом.:) В настоящее время я пользуюсь полной загрузкой + таблицей промежуточной таблицы: – Wuaner

+0

Загрузка больших трудоемких данных в промежуточные таблицы; Перенесите данные промежуточной таблицы в усеченные целевые таблицы на последнем этапе. Еще раз спасибо за ваш ответ. – Wuaner

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