【问题标题】:AWS DataPipeline: RedshiftCopyActivity OVERWRITE_EXISTING not enforcing primary keyAWS DataPipeline:RedshiftCopyActivity OVERWRITE_EXISTING 未强制执行主键
【发布时间】:2023-03-10 23:35:01
【问题描述】:

我有一个 DataPipeline,它通过 S3 将本地数据库中的数据导出到 Redshift(非常类似于 Incremental copy of RDS MySQL table to Redshift 模板)。我已经在管道定义中定义了主键并将 insertMode 设置为“OVERWRITE_EXISTING”,但是,我注意到一些行最终被重复了。在什么情况下会发生,我该如何预防?

【问题讨论】:

    标签: amazon-web-services amazon-redshift amazon-data-pipeline


    【解决方案1】:

    在 Redshift 中,它不会强制使用主键来限制重复值。 我们确实使用临时表来加载增量数据,然后我们通过检查记录是否存在来对目标表进行 upsert(使用合并)。

    这样就可以实现了。

    谢谢!!

    【讨论】:

    • 我观察到的结果最终是有原因的,但你是对的:因为 Redshift 不强制执行主键,所以手动暂存和执行 upsert 是控制更改的方法。
    【解决方案2】:

    几年后才发现这个帖子,添加一个答案以防它帮助别人:

    除了主键之外,Redshift 还使用 distkeys 来确定要覆盖哪些行。因此,在我的情况下,distkey 列中的更新值强制 Redshift 创建重复行,尽管主键保持不变。

    【讨论】:

    • Redshift 不强制执行唯一性约束(主键或其他)。请参阅:docs.aws.amazon.com/redshift/latest/dg/… 此外,distkeys 用于将行分配给集群内的切片,并且没有唯一性要求。
    • 这当然是真的,但对我来说重要(而且不是那么明显)的事情是管道定义中的insertMode: "OVERWRITE_EXISTING" 导致 Redshift 实际上查看 distkey 字段中的值来决定是否具有相同主键的行将被覆盖或附加。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2021-09-26
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多