2017-09-05 85 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