我们有一个数据仓库系统,我们需要将csv格式的s3上的数据加载到redshift表。唯一的限制是只将唯一记录插入到redshift中。
为了实现这一点,我们以下列方式使用登台表。
创建一个临时表。
将S3文件复制到TEMOPRARY表中。
BEGIN TRANSACTION
INSERT INTO {main redshift table}选择{在一个列上的临时表和主红色表之间连接,该列应该是唯一的,以使记录唯一}}
结束交易
select子查询中使用的连接返回那些存在于登台表中但不在主红色表中的记录。
以上机制是否没有竞争条件。
例如考虑 -
主红色表没有行,s3文件包含两个记录。
因此,当两个不同的进程/请求加载相同的s3文件时。每个请求的select查询将主redshift表读为空,并且join返回staging表中存在的两个行,并且两行插入两次,导致重复的行。
答案 0 :(得分:0)
将处理后的文件移到差异s3位置。
即 - 1假设您的app正在推送目标s1中的文件
2将文件格式s1移动到您的登台s2(从这个地方你必须填充红移临时表)
3将文件格式s2移动到s3。
4)现在做 开始交易
INSERT INTO {main redshift table}选择{在一个列上的临时表和主红色表之间连接,该列应该是唯一的,以使记录唯一}}
结束交易
答案 1 :(得分:0)
听起来像潜在的phantom read情景。您可以通过设置最高事务隔离级别SERIALIZABLE来避免这种情况。
但这可能会非常昂贵并导致死锁,因此您可能更愿意更改加载管道以逐个执行加载任务,而不是在一个表上并行执行多个加载任务。