Pentaho Data Integration Импорт большого набора данных из БД - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь импортировать большой набор данных из одной БД в другую (от MSSQL до MySQL). Преобразование делает это: получает подмножество данных, проверяет, является ли это обновлением или вставкой, проверяя хэш, сопоставляет данные и вставляет их в БД MySQL с помощью вызова API. Часть подмножества на данный момент строго ручная, есть ли способ настроить Pentaho для меня, своего рода итерация. Запрос, который я использую, чтобы получить подмножество:

select t1.* 
from (
    select *, ROW_NUMBER() as RowNum over (order by id)
    from mytable
) t1 
where RowNum between @offset and @offset + @limit;

Есть ли способ, которым PDI может установить смещение и повторить целое?

Спасибо

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете (несмотря на предупреждения) создать цикл в родительском задании, увеличивая переменную смещения на каждой итерации в шаге Javascript. Я использовал такую ​​настройку для использования веб-сервисов с неизвестным числом результатов, смещая смещение каждый раз, когда я получаю полную страницу, и останавливаясь, когда получаю меньше.

Настройка переменных

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

Обработка в преобразовании

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

Внутри преобразования (см. Нижнюю половину изображения) вы начинаете с табличного ввода, которыйиспользует подстановку переменных, помещая $ {Offset} и $ {Limit} там, где у вас есть @offset и @ limit.

Поток из Table Input затем переходит к обработке, но также копируется в шаг за шагом для подсчетастрок. Оставьте поле группы пустым и создайте поле, которое подсчитывает все строки. Установите флажок, чтобы всегда возвращать строку результатов.

Отправьте поток из Group By на шаг Set Variables и установите переменную NumRows в области родительского задания.

Возврат в обратном направлении

В основном задании перейдите от преобразования к шагу простой оценки, чтобы сравнить переменную NumRows с пределом. Если NumRows меньше, чем $ {Limit}, вы достигли последнего пакета, успех!

Если нет, перейдите к шагу Javascript, чтобы увеличить смещение следующим образом:

var offset = parseInt(parent_job.getVariable("Offset"),0);
var limit = parseInt(parent_job.getVariable("Limit"),0);
offset = offset + limit;
parent_job.setVariable("Offset",offset);
true;

Затем поток работ переходит к фиктивному шагу, а затем снова к преобразованию с новым значением смещения.

Примечания

  • В отличие от преобразования, вы можете установитьи используйте переменную в том же задании.
  • Для шага JS требуется значение "true";как последнее утверждение, поэтому оно сообщает об успешном выполнении задания.

screenshot of looped job and transformation

...