Удаление записей из целевой таблицы, если строки удаляются из источника с помощью интеграции данных Pentaho - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь удалить записи из целевой таблицы, если она не существует в источнике. Я использую PDI в качестве инструмента ETL. В источнике около 10 миллионов записей. Разве это не займет много времени, если ключ каждый день ищет совпадения во всей таблице, а затем удаляет, если он не найден. Как это может быть достигнуто наиболее эффективным способом.

Пожалуйста, вы можете объяснить подробно, так как я довольно новичок в этом инструменте

1 Ответ

0 голосов
/ 06 февраля 2020

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

Типичным способом сделать это является создание преобразования с двумя шагами ввода таблицы и шагом слияния (diff). Этот шаг принимает два входных потока, сопоставляет ключи и затем сравнивает любые другие поля, которые вы укажете, добавляя флаг в выходной поток с «новым», «удаленным», «измененным» или «идентичным». В вашем случае вы заботитесь только о «удаленных».

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

Входные данные таблицы должны выбирать столбцы первичного / уникального ключа и их порядок. Возможно, вам придется отсортировать строки в Pentaho, если исходные базы данных отличаются, и у вас есть не-числовой ключ c, но я предполагаю, что используется целое число или bigint.

Соедините два потока с шаг слияния (различий). Целевая таблица - это ссылка (старое состояние), исходная таблица - это сравнение (новое состояние). Используйте кнопку Получить поля, чтобы получить ключевые поля и сравнить поля. Это должны быть только ваши ключевые столбцы.

Добавьте шаг фильтрации строк и отфильтруйте по flagfield = "Удалено". Добавьте два фиктивных шага и соедините их как true и false. Теперь запустите преобразование и убедитесь, что строки, имеющие значение «true», действительно присутствуют в цели, но больше не в источнике.

После того, как вы проверили это и подтвердили, что он дает правильные строки, вы бы хотите использовать шаг «Удалить», чтобы удалить записи целевой таблицы. Это может привести к взаимоблокировке, если вы делаете это непосредственно в одной и той же трансформации, поскольку вы одновременно читаете и удаляете из целевой таблицы. Поэтому вместо этого вы можете добавить шаг «Копировать строки в результат», который передаст строки родительскому заданию.

В родительском задании вы выполняете второе преобразование. Для этого нужно всего два шага: получить строки из результата и удалить.

...