Data Integration — Kettle | Запуск работы/трансформации для каждой строки.

Reading Time: 2 minutes

data-integration-kettle-run_job_or_transformation_for_each_row

Продолжаем изучение базовых возможностей kettle.

Задача: «Трансформация произвела какую-то обработку и получила на выходе n строк. Для каждой строки необходимо выполнить работу.»

Задача сформулирована в общем виде, но этого вполне достаточно.

Первый job

Будет иметь вид:

Рис. 1 - Общий вид main.kjb

Рис. 1 — Общий вид main.kjb

Сделаем необходимые настройки.

Рис. 2 - Устанавливаем в свойствах Job "Выполнять для каждой входящей строки"

Рис. 2 — Устанавливаем в свойствах Job «Выполнять для каждой входящей строки»

Рис. 3 - Настраиваем передачу параметров в Job

Рис. 3 — Настраиваем передачу параметров в Job

Трансформация (getData)

Самым главным шагом данной трансформации является «Copy rows to result».  Этот шаг отправляет в родительский Job все строки и поля, которые поступили в этот шаг.

getData

Рис. 4 — getData пример генерации строк.

Работа (Job)

Просто выводим в log данные, для которых запускался Job.

Рис. 5 - Общий вид Job

Рис. 5 — Общий вид Job

jobProperties

Рис. 6 — настройка параметров Job

 

Рис. 7 - Выводим данные в Log. Нам необходимо видеть для чего выполняется Job

Рис. 7 — Выводим данные в Log. Нам необходимо видеть для чего выполняется Job

Результат

Результат работы вы можете увидеть в логе. Именно для этого мы добавляли шаг «Write To Log» в Job

outLog

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


Пример как обычно по ссылке: runJTForEachRow


Data Integration — Kettle | Запуск работы/трансформации для каждой строки.: 7 комментариев

  1. Vladimir

    Добрый день. Долго мучился с этим. Пытаюсь грузить таким способом *.dbf через xbase. Файлов много каждый по структуре разный. Имена файлов примерно такие 12122015_KK1.DBF, 12122015N1.DBF. Как их можно обработать т.е. убрать дату из имени файла и передать его в Table Input как имя таблицы.

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

      Добрый день.
      Что именно у вас не получается ?
      На первый взгляд структура вашего скрипта должна выглядеть примерно так:
      1) Старт
      2) трансформация
      Get file name — получаем имена файлов
      Modified Java Script Value — очистка имён файлов http://iie52.ru/wp-content/uploads/2016/05/2016-05-17_13-42-39.png
      Copy to result
      3) Трансформация на загрузку — http://iie52.ru/wp-content/uploads/2016/05/2016-05-17_13-27-39.png
      4) Конец

      PS: Сейчас у меня нехватка времени, не могу более подробно написать. Если всё равно не получиться пришлите ваш пример.

  2. Vladimir

    Приветствую снова. Спасибо за ответ отправляю свои скрины.
    http://s019.radikal.ru/i628/1605/50/b39ce7042cf4.jpg
    http://s017.radikal.ru/i430/1605/5d/9f4b92d643b1.jpg
    http://s019.radikal.ru/i606/1605/53/bf1cabc6e8ec.jpg
    Во второй трансформации если не указать GET ROWS FROM RESULT то параметры не передаются.
    Указал GET ROWS FROM RESULT далее в XBASE выбрал Step to read filenames from и указал GET ROWS FROM RESULT параметр соответственно fname и проверил он вроде бы работает но дальше в Table Output там где указываем имя таблицы я пытаюсь использовать второй параметр ${sname} вываливается ошибка я так понимаю туда просто ничего не передается. Уже кучу вариантов перепробовал. 🙁

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

      Возможные причины:
      1) Проверьте какие строки выходят из трансформации, которая получает имена файлов. Для этого достаточно поставить вывод в текстовый файл после шага Modified Java Script. Хотя должно быть всё нормально, но проверить стоит. Может у вас вообще не генерируются строки из шага Get file names
      2) Использовать Copy Rows From Result тут не нужно. У вас трансформация должна выполняться для каждой входящей строки. (можно сделать конечно иначе, что бы она все файлы обрабатывала, но это немного сложнее) Проверьте в настройках трансформации http://iie52.ru/wp-content/uploads/2016/05/2016-05-18_12-32-46.png

      Пример:
      Написал вам пример. Он точно рабочий. Разместите его в корне диска C:\ или перепишите пути внитри. Загрузки в нужную таблицу нет, но показано, что переданные параметры можно использовать. https://mega.nz/#!B80kFBjB!Bs8LLQxemJtu8NgTQ9uPdfLzTrxkrZd3e-AG9-WgStM

  3. Vladimir

    огромное спасибо Вам. Я сделал через Copy Rows From Result как я понял из первого вашего поста я не указал Perfomance Graph (configure), указал и все заработало. Попробовал Ваш пример и понял, что можно сделать без Copy Rows From Result оказывается на 100% не уверен но проблема была когда во второй трансформации я указывал параметры
    Parameter и Stream column name в моем случае это
    Parameter = sname, Stream column name = sname
    Parameter = fname, Stream column name = fname
    т. е. Stream и Parameter одни и те же параметры. Указал разные
    Parameter = sname1, Stream column name = sname
    Parameter = fname1, Stream column name = fname
    и все заработало. Указывал одинаковые потому что все примеру что на гуглил были именно такие , а дошло не сразу.
    еще раз спасибо.

  4. Vladimir

    Здравствуй.
    Подскажи а в эту конструкцию XBASE -> TABLE OUTPUT
    можно добавить еще одно поле к примеру дату извлеченную из имени файла. т. е. к каждой импортируемой таблице добавить поле. Количество полей разное у таблиц.

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

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