0

我在表 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中怎么可能。

我可以创建一个包含 Sat 到 Mon 间隔日期的表,如下所示:

Table Y

20170506 Sat  20170508 Mon
20170513 Sat  20170515 Mon
20170520 Sat  20170522 Mon

请给我一个想法,我应该使用 tJava 还是 tIntervalMatch 组件,这怎么可能。

4

3 回答 3

2

这是我的建议: 在此处输入图像描述

第一个子作业在这里根据工作日向输入添加序列,并将已完成和未完成的作业分开。
为此,我使用以下 tMap_23,其中两个流具有相同的 shema: 在此处输入图像描述

新字段 jobNumber 包含 jobname 的值 + 由破折号分隔的序列号(例如 job-1)。
由于序列基于工作日,因此与同一作业名关联的每一行都具有相同的 jobNumber 值。
两个流的结果都被存储到一个专用的 tHashOutput 中(这里称为 Completed 和 NotCompleted)。

之后,启动第二个子作业以排除与已完成记录关联的未完成记录。tMap_24的作用: 在此处输入图像描述 这是一个经典的基于jobNumber的inner join。捕获内部连接被拒绝的记录,然后按 jobNumber asc 和 execDate desc (tSortRow_1) 排序,除第一个 (tUniqRow_6) 之外,具有相同 jobNumber 的最终记录被消除,结果附加在 tHashOutput 的末尾,称为 Completed in the 1st子作业(此处为 RawResult 任务)。

上一个子作业读取名为 RawResult 的 tHashInput,去掉多余的字段 jobNumber,根据之前的作业对所有记录进行排序以在控制台上显示结果: 在此处输入图像描述

希望这可以帮助。
TRF

于 2017-05-26T19:26:15.543 回答
0

好的。如果我清楚地理解您的要求,那么我认为这将是您的答案。

Input(EntireTable) --> Tmap(Left outer Join) --> Complt_FLG = "Y" then all set ^ | | Lkp(仅记录状态为 Completed,Complt_FLG 为“Y”)

如果 Complt_FLG 为 null(这意味着不是 Y),则使用 taggregate 并通过对 Job id 进行分组来获取最大日期记录。

如果这是您正在寻找的或有任何问题,请告诉我。

于 2017-05-26T19:11:27.520 回答
0

这是我的答案:-

我已将任务分为两个子作业。

  1. 第一个子作业读取表 Y 的数据,一次一个周末地迭代。这里我已经将表 Y 的数据放入文件中,请找到下面的快照链接。

在此处输入图像描述

  1. 在主子作业中,我们将在变量 max_date 和 min_date 中获取星期开始和星期结束日期,并将这两个传递给下一个子子作业。

  2. 在子子作业中,我们将从主文件中获取数据并根据作业名称和日期对数据进行排序,并将记录传递给 tjavaflex。请找到 tSortRow 属性和子子作业的图像。

儿童子作业图像: 在此处输入图像描述

在子子作业中,我创建了 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 中,我已经编写了逻辑,它检查传入的行是否在一周之间并检查状态=已完成,一旦我们得到状态=已完成,我们将设置标志 ='false'。这样对于相同的job_name,它就不会再次检查条件。

一旦 job_name 更改,标志值变为 true 并在该周末再次重复上述步骤。

于 2017-05-30T12:31:26.267 回答