2015-05-11 134 views
0

我在Talend中創建了一個簡單的作業,它將執行2個Excel表單之間的數據的內部連接,然後將結果轉儲到輸出excel表單中。這可以通過下面的圖來最好的說明: -Talend中的條件映射

enter image description here

在TMAP中使用的映射是: -

enter image description here

但是對我來說是額外的挑戰,現在是,我必須執行只有當該行中的列值不爲NULL時才使用此映射。例如有一個映射row1.RECID = row2.RECID,但這應該只在row2.RECID不爲NULL時才合法。 我如何在Talend中實現這一點?我已經用tMap表達式進行了很多實驗,但是無法正確實現。
這是一個小的示例輸入,它是相應的預期輸出。 假設我的輸入具有值: - V1,V2,V3,V4
1,A,O,3
2,B,X,4
3,C,X,4

和查找具有值

V1,V2,V3
1,A,O,3
2,空,X,4
3,空值,C,4
2,空,X,空

然後輸出應爲: -
V1,V2,V3
1,A,O,3
2,B,X,4
2,B,X,4

+0

您使用的是正確的設置,內部聯接模式將讓您有非空值,如果你得到別的東西請加電流輸出樣本和所需的輸出到你的問題。 – 54l3d

+0

爲什麼你不過濾在v2列中有null的輸入行?因此tmap將接收主輸入的所有行,並僅接收查找的第一行,併爲您提供所需的輸出。 – 54l3d

+0

@ 5413d - >是的,嘗試過這種方式,但它變得太乏味了。是不是有一個更優雅的方法呢? – Sparky

回答

0

加入您的輸入流之前,你必須拒絕具有空值的行,我已經創建了基於給定簡單數據的映射。

enter image description here

+0

@ 5413d - >好主意!但我希望在多列上查看。我如何將這樣的過濾器應用於每個映射並使其獨立於其他列的映射? – Sparky

+0

@ 5413d - >已經進一步編輯輸出來表示我的查詢... – Sparky

+0

@Sparky只需在底部的過濾器框中輸入'row2.v1!= null和row2.v1!=「」和row2.v2! = null和row2.v1!=「」',你可以寫任何邏輯表達式來過濾你的數據 – 54l3d

0

嘗試映射row1中的最大值,put row2與左外部連接。

我你想要的只是在ROW1和ROW2值,可以在2行對於添加過濾器(但我想,這是不是你想要的)

+0

謝謝,但是我的要求是不同的..在問題中突出顯示了一個示例。 – Sparky

0

了Talend確實有一種更好的方法,將允許在多列數據的過濾。使用tSchemaComplianceCheck組件,其中過濾空白和空白就像點擊幾個複選框一樣簡單。這使您可以使用自己的模式來檢查空值和空值,並將其過濾掉。錯誤行進入拒絕流程,您可以選擇處理。如果你不希望捕獲和處理拒絕,你可以簡單地忽略它們。您的主要流程將只有通過合規性檢查的記錄。下面是使用它的一些技巧:

  • 在tSchemaComplianceCheck組件 - >基本設置界面中,單擊自定義的,它會告訴你每列。確保可爲空未選中,否則它將允許空值傳遞。

  • 在高級設置選項卡中檢查將所有空字符串視爲NUll。這將與前面的步驟一起工作來過濾掉null和empty。

  • 在您的Excel組件中,單擊進度設置選項卡,然後選中停止讀取遇到空行

以下是顯示基本流程和設置的屏幕截圖。你會鏈接到tMap而不是tLogRow。如果我已經正確理解你的問題,我想你會發現這是Talend的理想解決方案。

enter image description here

+0

@E LaRoche - >感謝這確實是一個偉大的組件過濾..但我真正想要的是一種實現條件映射的方式。如果查找文件中的特定字段爲NULL,則映射不應該被動態考慮!你提到的組件將以類似於我當前使用tFilterRow的實現方式來激勵我......但是,如何根據當前行的查找文件值在運行時動態更改映射? – Sparky