Создание глобальной переменной в Talend для использования в качестве фильтра в другом компоненте

У меня есть работа в Talend, которая предназначена для объединения некоторых данных из разных баз данных: одна база данных MySQL, а другая база данных MSSQL.

Что я хочу сделать, так это сопоставить выбранные номера кредитов из базы данных MySQL (около 82 000 номеров кредитов) с соответствующей информацией, которую мы разместили в базе данных MSSQL.

Однако таблицы в MSSQL, к которым я присоединяю данные из MySQL, намного больше (~ 2 миллиона строк), достаточно широки, и поэтому запросы требуют гораздо больше времени. В идеале я мог бы выполнить внутреннее соединение между двумя таблицами на основе номера кредита, но, поскольку они находятся в разных базах данных, это невозможно. Внутреннее соединение, которое выполняется внутри tMap, происходит после того, как ввод Lookup уже вернул его набор данных, который довольно велик (особенно потому, что этот конкретный запрос MSSQL будет выполнять определяемую пользователем функцию для каждого номера кредита).

Есть ли способ создать глобальную переменную из вывода запроса MySQL (а именно, номера кредита, выбранные запросом MySQL) и использовать эту глобальную переменную в качестве предложения IN в запросе MSSQL?


person Python Steve    schedule 14.03.2016    source источник
comment
Вы пробовали подключиться к связанному серверу из SQL Server в MySQL?   -  person shawnt00    schedule 20.03.2016


Ответы (1)


Это должно быть возможно. Я не работаю в MySQL, но у меня есть что-то примерно эквивалентное, что, я думаю, вы сможете адаптировать к своим потребностям.

На самом деле я никогда не отвечал на вопрос Stackoverflow, и пока я набирал это, страница начала говорить мне, что мне нужно как минимум 10 репутации, чтобы разместить здесь более 2 изображений/ссылок, и я думаю, что мне нужно 4 изображения, поэтому Я просто напишу это словами здесь и опубликую целиком с иллюстрациями в моем блоге на случай, если вам понадобится дополнительная информация (вполне вероятно, я думаю!)

Как видите, у меня есть некоторые данные, выходящие из таблицы и фильтруемые tFilterRow_1, чтобы отображать только те строки, которые меня интересуют.

Следующий шаг — ограничить его только тем полем, которое я хочу использовать в переменной. Я использовал tMap_3, а не tFilterColumns, потому что поле, которое я использую, представляет собой строку, и я хотел иметь возможность заключать ее в одинарные кавычки, но если вы используете целое число, вам может не понадобиться это делать. И, конечно же, если у вас много повторений, вы также можете добавить tUniqueRows, чтобы сэкономить много ненужных повторений.

Следующий шаг — тот, который творит магию. У меня есть такой список:

  • 'A1'
  • 'A2'
  • 'B1'
  • 'B2'

и т. д., и я хочу превратить его в «A1», «A2», «B1», «B2», чтобы я мог вставить его в свое предложение where. Для этого я использовал tAggregateRow_1, выбрав «список» в качестве агрегатной функции для использования.

Далее мы хотим взять этот список и поместить его в переменную контекста (я уже создал переменную контекста в метаданных — вы знаете, как это сделать, верно?). Используйте другой компонент tMap, загружая его в виджет tContextLoad. tContextLoad всегда имеет в своей схеме два столбца, поэтому сопоставьте вывод tAggregateRows со столбцом «значение» и введите имя переменной в «ключ». В этом примере моя переменная контекста называется MyList.

Теперь ваш список загружается в виде текстовой строки и сохраняется в переменной контекста, готовой к извлечению. Итак, откройте новый ввод и вставьте переменную в код sql следующим образом.

"ВЫБЕРИТЕ отдельный MY_COLUMN из MY_SECOND_TABLE, где the_selected_row в ("+ context.MyList+")"

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

person 18ck    schedule 15.03.2016