Data Integration — Kettle: Трансформации с параметрами. Когда, зачем и как ?

2 мин.

TransformParameter

Продолжим забавляться с kettle ? 🙂

Не знаю как вы, но я жутко ленивая тварь. Я за это себя ненавижу парой очень сильно, но не смотря на все внутренние противоречии, лень даёт стимул к решению той или иной задачи комплексно.

Для решения задач типа «перенеси мне  вот эти данные из табличек oracle в точно такие же но mssql» самым простым способом будет накидать в трансформации два шага «Table input» и «Table output» для каждой из табличек и жить как бы ровно. Но представьте, что этих табличек больше чем двадцать и тогда ваш скрипт из 2015-02-26 21-07-48 Скриншот экрана

 

превращается в 2015-02-26 21-14-38 Скриншот экрана

Красота конечно. И всё бы ни чего, НО! Базы данных имеют такие специальные вещи как внешние ключи «foreign keys«. Они заставляют разработчика соблюдать определённую последовательность копирования данных из одной базы в другую. «Ты такой берёшь лопату, зачерпываешь песка, подходишь к яме, а прораб, который стоит рядом с ямой говорит, что ты грёбанный дебил и нельзя кидать песок пока в яме нет щебня.» — Как то так.

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

2015-02-26 21-32-59 Скриншот экрана

Жопень конечно несусветная.  И из-за этой нелицеприятной ситуации мы начинаем думать:»Как сделать так, что бы это была хотя бы одна трансформация просто работающая через параметры?»

На самом деле очень просто.

1) Создаём трансформацию, где только два шага

2015-02-26 21-43-45 Скриншот экрана

 

2) Заходим в свойства трансформации и во вкладке параметры «Parameters» создаём параметр «SyncTableName»  или как вам угодно. Именно через этот параметр мы будем передавать имена таблиц, данные из которых нужно перенести в другую базу данных.

2015-02-26 21-45-43 Скриншот экрана

 

3) Пропишем в шагах «Table input» и «Table outpu», что имя таблички нам нужно брать из глобального параметра «SyncTableName».

2015-02-26 21-51-47 Скриншот экрана

2015-02-26 21-52-44 Скриншот экрана

 

Ну вот и всё. У нас готова универсальная трансформация для копирования данных из любой таблички.

 

Теперь в нашем джобе в каждой трансформации для каждой таблицы указываем универсальную трансформацию и имя таблички.

2015-02-26 22-05-12 Скриншот экрана

2015-02-26 22-06-20 Скриншот экрана

 

Вот собственно и всё. Изначально я хотел привести пример как избавиться от такого количество элементов в джобе и сделать все ещё более универсальным, через файл с указанием последовательности загрузки таблиц в нём, но подумал, что это достойно отдельной статьи, так как это будет относиться немного к другой теме.

До новых встреч.

Data Integration — Kettle: Трансформации с параметрами. Когда, зачем и как ?: 3 комментария

  1. ФЕДОР

    PDI 9
    Попрбовал сделать то же на мс-скл сервре

    если явно указываю в copy2.ktr
    SyncTableName = aa
    все работает

    Если вызываю из
    ${Internal.Entry.Current.Directory}/copy2.ktr

    Я вижу что 0 записей
    но не могу понять ПОЧЕМУ ??
    Вопрос как понять в чем проблема
    если трансформация НЕ выдадет ошоибок ??

    1. ilinei52 Автор записи

      Попробуйте проверить есть ли что-то в переменной ${Internal.Entry.Current.Directory}. На сколько я помню с ней могут быть проблемы в зависимости от того используете ли вы репозиторий или нте. Если я смогу добраться в ближайшие пару дней, попробую посмотреть на 9-ой версии.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.