2017-09-05 84 views
0

我們通過Talend導入Salesforce的數據,並且我們有多個具有相同內部ID的項目。Talend通過Salesforce輸出避免重複的外部ID

由於upsert在Salesforce中的工作方式,此類導入失敗,並顯示錯誤「指定了重複的外部標識」。目前,我們通過將tSalesforceOutput的提交大小設置爲1來解決此問題,但該工作僅適用於少量數據,否則將耗盡Salesforce API限制。

在Talend中是否有一種已知的方法?例如,要確保具有相同外部ID的項目以tSalesforceOutput的不同「提交」結束?

回答

1

這裏是我提議的解決方案設計: enter image description here

  • tSetGlobalVar在這裏初始化變量「完成」爲假。
  • tLoop以(Boolean)globalMap.get("finish") == false作爲結束條件啓動while循環。
  • tFileCopy用於將初始文件(例如A)複製到新文件(B)。
  • tFileInputDelimited讀取文件B.
  • tUniqRow消除重複項。唯一身份記錄轉到tLogRow,您必須用tSalesforceOutput替換。如果有任何轉到tFileOutputDelimited的記錄(如果文件已經存在,則選中「拋出一個錯誤」)時,將記錄複製到名爲A(與原始文件同名的文件)。
  • OnComponent行tUniqRow激活這爲用下面的代碼全局光潔度新值tJava後:
    if (((Integer)globalMap.get("tUniqRow_1_NB_DUPLICATES")) == 0) globalMap.put("finish", true);

釋用以下示例數據:
線1
第2行
線3
線2
線4
線2
線5
線3

在第一迭代中,5個不重複記錄被推入tLogRow,3個重複推入文件A和「完成」不改變,因爲這裏重複。
在第二次迭代中,對2個唯一記錄和1個重複操作進行重複。
在第3次迭代中,操作重複1次,因爲沒有重複,「finish」設置爲true,循環自動結束。

下面是最終的結果:
enter image description here

你也可以決定使用其他的全局變量設置銷售人員承諾的水平(使用語法(Integer)globalMap.get("commitLevel"))。默認情況下,該變量將被設置爲200,如果有任何重複,該變量將被設置爲1。同時,將「finish」設置爲true(不測試重複次數),第一次迭代的提交級別爲200,第二次迭代的次數爲1(且不需要超過2次迭代)。
根據可能的重複次數,您將決定更好的選擇,但您可以注意到,您可以在不改變作業設計的情況下做到這一點。

我認爲它應該可以解決您的問題。讓我知道。

問候,
TRF

+0

在審查我的第二個選項後,看起來它會稍微複雜一點,我寫的tUniqRow需要在2bd迭代期間繞過。如果你想採用這個解決方案,用tJavaRow替換tJava,然後在提交級別設置爲1後添加第二個tSalesforceOutput。最後它是一個不同的過程。你只需要選擇哪一個更適合你的用例。 – TRF

+0

我不知道爲什麼文件的內容在每次迭代時都會發生變化,因此重複次數會更改 – Edmondo1984

+0

因爲在每次迭代中,我們都會獲得給定ID的第一條記錄,並將重複項推送到文件中,從而記錄更少的記錄在每個時間。 – TRF

1

你的意思是你在輸入中有兩次或多次相同的記錄(例如相同的帳戶)?
如果是這樣,您不能嘗試消除重複項並只保留需要推送到Salesforce的記錄嗎?
否則,如果每條記錄都有特定的信息(因此您需要所有輸入記錄在Salesforce中具有完整的輸入記錄),請考慮先合併記錄以將結果推送到Salesforce中。最後,如果你不能做到這一點,請在雙方的臨時空間內推送雙記錄,然後將雙記錄推入Salesforce,並重復其他過程,直到沒有更多雙倍。
就個人而言,如果您無法消除雙倍差距,我更喜歡第二種方法,因爲它是擁有較少Salesforce API調用的解決方案。

希望這會有所幫助。
TRF

+0

可以提供約「推doublons在臨時空間和迭代的過程」更多的細節? Talend如何做到這一點? – Edmondo1984

+0

我的意思是將結果推送到tHashOutput或分隔文件,如你所願 – TRF

+0

沒關係,但是過程迭代呢?這是我不瞭解的部分 – Edmondo1984