[英]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分組獲得最大日期記錄。
如果這是您要查找的內容或有任何疑問,請告訴我。
這是我的答案:
我將任務分為兩個子任務。
在主子作業中,我們將在變量max_date和min_date中獲取星期開始日期和星期結束日期,並在下一個子子作業中傳遞這兩個信息。
在子子作業中,我們將從主文件中獲取數據,並根據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.