Сделать DB INSERT на основе метаданных ввода текстового файла

Я разрабатываю ETL и должен выполнить некоторые процедуры для его мониторинга.

В начале я должен сделать INSERT в БД, чтобы создать запись, сообщающую имя файла и дату и время начала процесса. Этот запрос вернет PK записи, и его необходимо сохранить. Когда ETL этого файла завершается, я должен обновить эту запись, информирующую об успешном завершении ETL и дате и времени завершения процесса.

Я использую ввод текстового файла для поиска файлов, соответствующих его регулярному выражению, и добавляю его «Дополнительные поля вывода» в поток. Но я не могу найти компонент, который будет работать только для первой записи и будет выполнять команду SQL для INSERT.


person Hikari    schedule 28.08.2017    source источник


Ответы (3)


Вы можете использовать «Определить последнюю строку» и «Фильтровать строки» вместе, поэтому вы сохраните только одну строку из вашего ввода (фильтруя только последнюю). Вы INSERT будете сразу после шага Filter Rows.

введите здесь описание изображения

Поскольку вам нужно будет разделить поток, вам нужно будет соединить столбец идентификатора с исходными строками ввода текста.

person jfneis    schedule 28.08.2017
comment
Я думаю, что понял вашу идею, но не смог реализовать ее, основываясь только на изображении. Что я сделал, так это проверил Rownum в опции вывода при вводе текстового файла. Затем я использую Filter Rows, чтобы разделить поток, перемещая первую строку в поток, а все остальные строки в другой поток. В потоке, который получает первую строку, я использую поиск в базе данных, чтобы запросить таблицу для имени файла. Если поиск приводит к таблице PK, я знаю, что файл уже был обработан, если он приходит как null, я знаю, что файл новый для обработки. - person Hikari; 30.08.2017
comment
@Hikari Я понял, что вы хотели 1) вставить строку и б) обновить эту строку в конце вашего преобразования. Верно? После того, как у вас есть только одна строка, выполните вставку db и JOIN поле ID с вашим основным потоком. - person jfneis; 30.08.2017

У вас также есть Unique row. Если не указать, по какому полю фильтровать уникальное значение, будет выведена одна и ровно одна строка.

Теперь, если я неправильно понял ваши спецификации, я бы предпочел использовать систему регистрации Kettle< /а>. Щелкните в любом месте, выберите свойства во всплывающем окне, затем вкладку «Журналирование». Он предоставит вам статус (Started/End/Stop/...) и много дополнительной информации, например, количество ошибок, прочитанную и записанную строку (просто сообщите PDI, на каком шаге он должен искать эти числа) .

Вы даже можете почти в реальном времени прочитать в БД ту же информацию, что и на нижней панели PDI. Просто щелкните нужные поля и нажмите кнопку SQL, чтобы создать файл.

Просто обратите внимание, что по историческим причинам дата начала на самом деле не является начальной датой (это дата предыдущего успешного запуска). Дата начала называется Replay date.

А также, если вам нужна эта система, чтобы контролировать нагрузку и знать, должен ли запуск запускаться или нет, позаботьтесь о том, чтобы при внезапном завершении система иногда не успевала записать «Конец» в журнал. Поэтому logdate<now-10minutes надежнее.

введите здесь описание изображения

person AlainD    schedule 29.08.2017
comment
Очень интересно! Я посмотрю на это спасибо! - person Hikari; 30.08.2017

Чтобы сделать что-то только для первой строки потока, используйте шаг «Добавить последовательность» (начать с 1), за которым следует шаг «Фильтровать строки» с условием «seq = 1».

person matthiash    schedule 31.08.2017