Talend ETL Чтобы отфильтровать одну строку из набора строк на основе условия
У меня есть набор строк в таблице X как
job1 20170506 Sat Not Run
job1 20170507 Sun Completed
job1 20170508 Mon Not Run
job1 20170513 Sat Completed
job1 20170514 Sun Failed
job1 20170515 Mon Not Run
job1 20170520 Sat Not Run
job1 20170521 Sun Not run
job1 20170522 Mon Not Run
job2 20170506 Sat Failed
job2 20170507 Sun Not run
job2 20170508 Mon Completed
job2 20170513 Sat Completed
job2 20170514 Sun Completed
job2 20170515 Mon Completed
job2 20170520 Sat Not Run
job2 20170521 Sun Not run
job2 20170522 Mon Not Run
and so on.
Мне нужно взять выходные (суббота, воскресенье, понедельник) как единое целое и получить следующую таблицу:
job1 20170507 Sun Completed
job1 20170513 Sat Completed
job1 20170522 Mon Not Run
job2 20170508 Mon Completed
job2 20170515 Mon Completed
job2 20170522 Mon Not Run
Если задание выполнено в течение какого-либо из этих трех дней, оно считается выполненным. В противном случае, если все не запущены, должна быть принята последняя запись с не выполненным. Как это возможно в talend.
Я могу создать таблицу, содержащую даты интервала с субботы по понедельник, следующим образом:
Table Y
20170506 Sat 20170508 Mon
20170513 Sat 20170515 Mon
20170520 Sat 20170522 Mon
Пожалуйста, дайте мне представление, как мне использовать компоненты tJava или tIntervalMatch, как это возможно.
3 ответа
1-ая подзадача здесь для добавления последовательности к входу на основе дня недели и для разделения выполненных и не завершенных заданий.
Для этого я использую следующий tMap_23, в котором оба потока имеют одну и ту же схему:
Новое поле jobNumber содержит значение имени задания + порядковый номер, разделенный тире (например, job-1).
Поскольку последовательность основана на дне недели, все строки, связанные с одним и тем же именем задания, имеют одинаковое значение для jobNumber.
Результат для обоих потоков запоминается в выделенном tHashOutput (здесь он называется Completed и NotCompleted).
После этого запускается вторая подзадача, исключающая записи NotCompleted, связанные с завершенной. Это роль tMap_24: Это классическое внутреннее соединение, основанное на jobNumber. Отклоненные записи внутреннего объединения отлавливаются, затем сортируются по заданию jobNumber asc и execDate desc (tSortRow_1), и конечные записи с одинаковым jobNumber удаляются, кроме 1-го (tUniqRow_6), и результат добавляется в конце tHashOutput, называемого Completed, в 1-й subjob (здесь задача RawResult).
Последнее задание прочитало tHashInput с именем RawResult, удалило дополнительное поле jobNumber, отсортировало все записи по заданию, прежде чем отобразить результат на консоли:
Надеюсь это поможет.
TRF
Хорошо. Если бы я понял ваше требование ясно, то я думаю, что это был бы ваш ответ.
Input(Целая таблица) -> Tmap(внешнее левое соединение) -> Complt_FLG = "Y", тогда все установлено ^ | | Lkp(записывает только статус "Завершено", Complt_FLG как "Y")
если Complt_FLG равен нулю (что означает не Y), тогда используйте taggregate и получите максимальную запись даты, группируя по идентификатору задания.
Пожалуйста, дайте мне знать, если это то, что вы ищете или какие-либо вопросы.
Вот мой ответ:-
Я разделил задачу на две подзадачи.
- Первая подзадача читает данные таблицы Y и выполняет итерации по одному в выходные дни. Здесь я взял данные таблицы Y в файл, пожалуйста, найдите ссылку на снимок ниже.
введите описание изображения здесь
В основной подработке мы извлечем дату начала и дату окончания недели в переменных max_date и min_date и передадим эти две следующие дочерние подзадачи.
В дочерней подзадаче мы будем извлекать данные из основного файла и сортировать эти данные на основе имени_действия и даты и передавать записи в tjavaflex. Пожалуйста, найдите изображение свойств tSortRow и дочерней работы.
Child Subjob Image: введите описание изображения здесь
Здесь, в дочерней подработке, я создал 8 переменных контекста:
a.) MIN_DATE: проходит через родительское задание b.) MAX_DATE: проходит через родительское задание c.) JOB_NAME: это имя задания в записи обработки d.) DATE: дата выполнения задания для обработки записи e.) DAY: день выполнения задания для обработки записи f.) STATUS: статус задания g.) OUT_JOB_NAME h.) OUT_DATE i.) OUT_DAY j.) OUT_STATUS
Префиксной переменной OUT являются те, которые должны быть напечатаны в качестве вывода.
В tJavaflex я написал логику, она проверяет, находится ли входящая строка между неделями, и проверяет статус = выполнено, как только мы получим статус = выполнено, мы установим флаг ='ложь'. так что для того же job_name, он не будет проверять условие снова.
После того, как задано имя задания, значение флага становится истинным и повторяет вышеуказанные шаги снова для этих выходных.