DML 操作期间检测到重复行 - Snowflake - Talend

1 upsert duplicates talend snowflake-cloud-data-platform

我想使用 Talend 将数据加载到 Snowflake 中。我将 tSnowflakeOutput 与 Upsert 选项一起使用,因为我想插入数据(如果 Snowflake 中不存在),或者更新行(如果存在)。我使用主键来识别已经存在的行。

当我运行我的作业时,出现以下错误:

DML 操作期间检测到重复行

我知道问题是由于 Snowflake 中存在的一行引起的,我想更新该行,但我得到的只是这个错误。你知道为什么吗?

请帮忙 :)

Dhw*_*ade 14

Talend 连接器可能在内部使用 Snowflake 的 MERGE 操作。正如 @mike-walton 提到的,报告错误是因为 MERGE 不接受源数据中的重复项。考虑到它是插入或更新(如果存在)操作,如果多个源行连接到目标记录,系统无法决定使用哪个源行进行操作。

来自文档

当合并将目标表中的一行与源中的多行连接时,以下连接条件会产生不确定的结果(即系统无法确定用于更新或删除目标行的源值) 选择目标行使用多个值进行更新(例如,WHEN MATCHED ... THEN UPDATE)

解决方案1

文档中提到的一种选择是设置 ERROR_ON_NONDETERMINISTIC_MERGE 参数。这将只选择任意源行进行更新。

解决方案2

另一种选择是通过使用以下形式的 MERGE 查询来使其具有确定性。这实际上对源表进行了重复数据删除,并允许您选择重复项之一作为更新的首选表。

merge into taget_table t
using (
  select *
  from source_table
  qualify
    row_number() over (
      partition by 
        the_join_key
      order by
        some_ordering_column asc
    ) = 1
) s
on s.the_join_key = t.the_join_key
when matched then update set
  ...
when not matched then insert 
  ...
;
Run Code Online (Sandbox Code Playgroud)

在 Talend 中执行同样的操作可能只需要在 ETL 映射上游执行重复数据删除操作。