簡體   English   中英

Talend ETL根據條件從一組行中過濾一行

[英]Talend ETL To filter one row from a set of rows based on a condition

我在表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

如果作業在這三天中的任何三天內完成了輸入,則視為已完成。 否則,如果全部未運行,則采用“未運行”的最新條目。 怎么可能。

我可以創建一個包含星期六到星期一間隔日期的表,如下所示:

Table Y

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

如果我使用tJava或tIntervalMatch組件,請給我一個主意。

這是我的建議: 在此處輸入圖片說明

這里的第一個子作業是根據工作日向輸入中添加序列,並分隔已完成和未完成的作業。
為此,我使用以下tMap_23,其中兩個流具有相同的shema: 在此處輸入圖片說明

新字段jobNumber包含作業名稱的值+用短划線分隔的序列號(例如job-1)。
由於該序列基於工作日,因此與同一作業名稱關聯的每一行的jobNumber值都相同。
兩種流的結果都存儲在專用的tHashOutput中(這里稱為Completed和NotCompleted)。

之后,第二個子作業開始,以排除與“已完成”相關的未完成記錄。 tMap_24的作用: 在此處輸入圖片說明 這是基於jobNumber的經典內部聯接。 捕獲內部聯接拒絕的記錄,然后對jobNumber asc和execDate desc(tSortRow_1)進行排序,並刪除具有相同jobNumber的最終記錄,但第一個記錄(tUniqRow_6)除外,並將結果附加到名為1st Completed的tHashOutput的末尾子作業(此處為RawResult任務)。

最后一個子作業讀取了稱為RawResult的tHashInput,刪除了多余的字段jobNumber,根據作業對所有記錄進行了排序,然后才能在控制台上顯示結果: 在此處輸入圖片說明

希望這可以幫助。
TRF

好。 如果我清楚地了解您的要求,那么我認為這將是您的答案。

輸入(EntireTable)-> Tmap(左外部聯接)-> Complt_FLG =“ Y”然后全部設置^ | | Lkp(僅將狀態記錄為“已完成”,將Complt_FLG記錄為“ Y”)

如果Complt_FLG為null(表示不是Y),則使用taggregate並通過按作業ID分組獲得最大日期記錄。

如果這是您要查找的內容或有任何疑問,請告訴我。

這是我的答案:

我將任務分為兩個子任務。

  1. 第一個子作業讀取表Y的數據,並一次迭代一個周末。 在這里,我已將表Y的數據放入文件中,請找到以下快照鏈接。

在此處輸入圖片說明

  1. 在主子作業中,我們將在變量max_date和min_date中獲取星期開始日期和星期結束日期,並在下一個子子作業中傳遞這兩個信息。

  2. 在子子作業中,我們將從主文件中獲取數據,並根據job_name和date對數據進行排序,並將記錄傳遞給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,並在該周末再次重復上述步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM