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 и получите максимальную запись даты, группируя по идентификатору задания.

Пожалуйста, дайте мне знать, если это то, что вы ищете или какие-либо вопросы.

Вот мой ответ:-

Я разделил задачу на две подзадачи.

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

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

  1. В основной подработке мы извлечем дату начала и дату окончания недели в переменных max_date и min_date и передадим эти две следующие дочерние подзадачи.

  2. В дочерней подзадаче мы будем извлекать данные из основного файла и сортировать эти данные на основе имени_действия и даты и передавать записи в 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, он не будет проверять условие снова.

После того, как задано имя задания, значение флага становится истинным и повторяет вышеуказанные шаги снова для этих выходных.

Другие вопросы по тегам