Интеграция данных Talend: как поддерживать столбцы ввода во всех компонентах?

Мой лист ввода имеет 3 поля I1, I2 и I3.

Мне нужно вставить эти поля в две таблицы.

Таблица1 должна иметь I1 и I2 из поля ввода и иметь идентификатор в качестве столбца PK. Таблица2 должна иметь I3. Отношение внешнего ключа Table1 ID.

Используя talend, я вставил данные первых двух столбцов в таблицу1 (I3 опущен в компоненте вывода этой таблицы), и у меня есть автоматически увеличивающийся идентификатор. Теперь я хочу вставить ID и I3 в таблицу.

Но во втором выводе таблицы я не мог видеть столбец I3 в потоке, так как мы пропустили I3 на первом этапе.

Можете ли вы помочь, как получить столбец I3 для второго компонента вывода таблицы?

Спасибо


person Daniel A    schedule 15.09.2016    source источник


Ответы (3)


Вы сможете сделать это с помощью простого tMap с двумя выходами:

tDBInput --- tMap ---tDBOutput1
                  ---tDBOutput2

В tMap вам просто нужно выбрать поля для правильного вывода. Вы можете использовать последовательность Talend Numeric.sequence("s1",1,1) в разделе "Var" tMap (центральная панель) и поместить ее в 2 выхода в качестве идентификатора.

person Corentin    schedule 15.09.2016
comment
Если я использую Numeric.sequence(s1,1,1), это может создать проблему при вставке данных (дубликат записи, поскольку значение ID автоматически увеличивается). Это решение будет работать временно. Но это не может быть хорошим решением для долгосрочных целей. - person Daniel A; 16.09.2016
comment
Если вы планируете запускать его несколько раз (а не одноразовое выполнение), вы можете прочитать свою целевую таблицу как поиск в tMap и получить max (ID). Затем вы запускаете Numeric.sequence с этого maxID вместо 1. - person Corentin; 16.09.2016

Я сделал это следующим образом...

Просмотр всех заданий: Обзор всех заданий

Настройки tMap: Настройки tMap

person Daniel A    schedule 19.09.2016

Другой способ сделать это — использовать двухэтапный процесс. Вы можете создать две отдельные «линии обработки» или подзадания внутри одного задания.

Шаг 1 – l1, l2

Первая подзадача будет, как сказал @Corentin,

tExcelInput1 -- tMap1 -- tDBOutput1 (l1, l2)

Шаг 2 – 3

Второе подзадание, которое можно подключить с помощью коннектора tDBInput1 onSubjobOk, будет выглядеть так

tExcelInput2 -- tMap2 -- tDBOutput2 (l3)
              |--- tDBInput3, lookup ID (with l1)

Теперь первое подзадание добавляет все значения в таблицу 1. Когда все работает нормально, все значения для l3 обрабатываются с поиском идентификатора в l1. Это будет работать с полем автоинкремента в базе данных. Поиск будет выглядеть просто как SELECT ID FROM table1, а в tMap просто используйте l3 для поиска.

Обзор

Если вам легче увидеть работу, пожалуйста, проверьте следующее изображение.

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

Поиск будет выглядеть так:

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

person tobi6    schedule 16.09.2016
comment
Привет! Большое спасибо за этот пост. Я выполнил эту работу таким же образом, но как мы можем убедиться, что ID и I3 будут из одной строки. Кроме того, этот вид работы будет использоваться один раз. Если это запланированное задание, как мы можем получить идентификатор для новых вставленных строк (допустим, у нас уже есть строки в таблице 1)? Предположим, если порядок вставки изменился при вставке строк в таблицу 1, что произойдет? Пожалуйста, предложите такие сценарии... - person Daniel A; 19.09.2016
comment
Ты прав. Поиск должен выполняться по row3.l1 и row3.l2, если эти строки на самом деле уникальны. Если новые данные также уникальны, задание будет выполняться каждый раз, когда вы его вызываете. Поскольку речь идет только о схемах таблиц, я просто предположил. - person tobi6; 19.09.2016