AWS DataPipeline:RedshiftCopyActivity OVERWRITE_EXISTING 未强制执行主键

Posted

技术标签:

【中文标题】AWS DataPipeline:RedshiftCopyActivity OVERWRITE_EXISTING 未强制执行主键【英文标题】:AWS DataPipeline: RedshiftCopyActivity OVERWRITE_EXISTING not enforcing primary key 【发布时间】:2016-06-20 08:51:12 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

这样就可以实现了。

谢谢!!

【讨论】:

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

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

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

【讨论】:

Redshift 不强制执行唯一性约束(主键或其他)。请参阅:docs.aws.amazon.com/redshift/latest/dg/… 此外,distkeys 用于将行分配给集群内的切片,并且没有唯一性要求。 这当然是真的,但对我来说重要(而且不是那么明显)的事情是管道定义中的insertMode: "OVERWRITE_EXISTING" 导致 Redshift 实际上查看 distkey 字段中的值来决定是否具有相同主键的行将被覆盖或附加。

以上是关于AWS DataPipeline:RedshiftCopyActivity OVERWRITE_EXISTING 未强制执行主键的主要内容,如果未能解决你的问题,请参考以下文章

amazon datapipeline 中 redshift 副本的 sqlactivity 不会为文件名选择通配符

在 AWS 中设置 Datapipeline 流

AWS DataPipeline表示未找到DynamoDB表

覆盖现有插入模式如何在 aws 数据管道的 redshiftcopyactivity 中工作

使用 AWS Datapipeline 将 DynamoDB 导出到 S3 数据

如何从 EC2 运行 Redshift 复制命令