#talend
#talend
Вопрос:
У меня есть сценарий, в котором я хотел бы пропустить выполнение компонента на основе условия и запустить его последовательные компоненты в Talend.
Возможно ли это вообще?
Комментарии:
1. Пожалуйста, опубликуйте скриншот вашей работы. В зависимости от того, что вы делаете со своей работой, вы можете условно выполнять подчиненные задания, используя
Run if
соединитель (а неMain
илиon Subjob Okay
).2. Вы правы. Я могу установить условную зависимость, используя соединитель Run If. Если условие удовлетворяет, компонент будет выполнен, но если нет, то я хотел бы пропустить этот компонент и перейти к его следующему компоненту.
3. Можете ли вы опубликовать скриншот своей работы (и другие скриншоты любого важного места), чтобы мы могли понять, как лучше всего это сделать? Я могу придумать несколько вариантов, но это зависит от того, что вы делаете с этой работой.
4. мы должны сделать что-то подобное, сценарий следующий: Каскад схемы удаления -> Создать схему -> Вложенное задание (удалить таблицу, создать таблицу) -> загрузить данные в таблицы, мы хотим иметь логическое значение DROP_SCHEMA в контексте, поэтому первый компонент должен выполняться, когда DROP_SCHEMA = 1, иначе его нужно пропустить.
5. Точно так, как упоминал Балазс. Рассмотрим задачу здесь как Pre_Job -> оценка условия -> tSystem1 -> tSystem2 Если условие в переменной равно all, тогда естественный поток, такой как tSystem1, а затем tSystem2. Но если условие в переменной saya tSystem2, тогда пропустите tSystem1 и выполните tSystem2 самостоятельно. Я не смог опубликовать ни одного снимка экрана. так что просто объяснил образно.
Ответ №1:
Вам доступны два варианта условного выполнения частей вашей работы.
Если компонент, который следует за вашей условной проверкой, может быть начальным компонентом (если вы поместите его на холст, тогда у него должен быть зеленый фон), тогда вы можете использовать Run if
соединитель, чтобы связать его с предыдущей частью вашей работы следующим образом:
В этом примере мы просто вызываем другой компонент tJava условно, но это может быть любой компонент, который можно запустить.
Где первый компонент tJava (Set condition boolean) настроен с помощью следующего кода:
Boolean condition = false;
globalMap.put("condition",condition);
И два Run if
соединителя установлены как ((Boolean)globalMap.get("condition")) == true
и ((Boolean)globalMap.get("condition")) == false
соответственно.
Лучшим вариантом может быть использование фильтрации в компоненте tMap или tFilterRow, и это также позволяет вам ссылаться на компоненты, которые не являются начальными компонентами. Для этого вы должны настроить свою работу, как показано ниже:
В этой работе я жестко закодировал некоторые табличные данные в компоненте tFixedFlowInput:
Затем мы используем tMap для фильтрации потоков данных для любых следующих компонентов:
В котором мы проверяем значение столбца булевых условий наших данных. В качестве иллюстрации я также применил некоторое простое условное преобразование к данным, где к «истинным» строкам добавляется 1000 к их значению, а к «ложным» строкам из их значения вычитается 100.
Отсюда вы можете продолжить выполнение своей работы в обычном режиме, в этом случае мы ссылаемся на компонент tSystem для выполнения системных команд в соответствии с вашим комментарием.
Ответ №2:
Я смоделировал работу для вас:
У меня есть контекстная переменная с именем: startFrom К ней можно получить доступ с помощью context.startFrom
Я поместил tJava с несколькими элементами:
Я использую 4 настройки контекста:
- По умолчанию
- Нормальный
- Выбрать
- два
Итак, моя работа:
- Ничего не делает
- Начните с «Start»
- Начните с «Optional_Start»
- Начните с «RecoverFromHere»
Если настройки следующие:
context.startFrom.equals(«выбрать»)
Recovery и Recovery1 выводят свои имена с помощью System.out
Если я начну свою работу, я могу выбрать, где я хочу ее запустить. Если я ничего не выберу: значение контекста равно null, это ничего не сделает.
Комментарии:
1. Это то, чего я ожидал, спасибо за идею. Немного изменил его, чтобы сделать запуск динамичным.
Ответ №3:
you can not use prejob as it does not have runif trigger, but you can do like this
prejob -->oncomponentok-->tJava (in here you poupulate you evaluate your condition say as given below)---->RUN IF Trigger - you put your condition here..((String)globalMap.get("var_myCondition")).equals("true") --->component to run in true condition
--->RUN IF Trigger on (tJava) ---((String)globalMap.get("var_myCondition")).equals("false")--->component to run in false condition
in short your job would be like
prejob-->tJava---(RUNIF TRIGGER)------>component/flow to run in true condition
---(RUNIF TRIGGER)------>component/flow to run in false condition
tJava code
String myCondition="false";
globalMap.put("var_myCondition",myCondition);