首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数据从亚马逊S3复制到红移,并避免重复行

将数据从亚马逊S3复制到红移,并避免重复行
EN

Stack Overflow用户
提问于 2013-03-29 18:23:36
回答 3查看 22.1K关注 0票数 11

我正在将数据从亚马逊S3复制到红移。在此过程中,我需要避免再次加载相同的文件。我的红移表没有任何独特的约束。有没有办法使用copy命令来实现这一点?

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html

我尝试添加唯一约束并将列设置为主键,但没有成功。Redshift似乎不支持唯一/主键约束。

EN

回答 3

Stack Overflow用户

发布于 2013-06-13 02:21:29

目前还没有从redshift中删除重复项的方法。Redshift不支持primary key/unique key约束,也不能使用行号删除重复项(删除行号大于1的行),因为redshift上的delete操作不允许复杂的语句(而且行号的概念在redshift中也不存在)。

删除重复项的最好方法是编写一个cron/quartz作业,该作业将选择所有不同的行,将它们放在一个单独的表中,然后将该表重命名为原始表。

Insert into temp_originalTable (Select Distinct from originalTable)

Drop table originalTable

Alter table temp_originalTable rename to originalTable

票数 4
EN

Stack Overflow用户

发布于 2021-03-07 09:26:34

我们每周删除重复项,但您也可以在@Kyle提到的加载事务期间执行此操作。此外,这确实需要存在一个自动生成的ID列作为删除的最终目标:

代码语言:javascript
复制
DELETE FROM <your table> WHERE ID NOT IN ( 
   SELECT ID FROM (
      SELECT *, ROW_NUMBER() OVER 
         ( PARTITION BY <your constraint columns> ORDER BY ID ASC ) DUPLICATES 
      FROM REQUESTS 
   ) WHERE DUPLICATES=1
); COMMIT; 

例如:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS public.requests
(
    id BIGINT NOT NULL DEFAULT "identity"(1, 0, '1,1'::text) ENCODE delta
    kaid VARCHAR(50)   NOT NULL 
    ,eid VARCHAR(50)   NOT NULL ENCODE text32k
    ,aid VARCHAR(100)  NOT NULL ENCODE text32k
    ,sid VARCHAR(100)  NOT NULL ENCODE zstd
    ,rid VARCHAR(100)  NOT NULL ENCODE zstd
    ,"ts" TIMESTAMP WITHOUT TIME ZONE NOT NULL  ENCODE delta32k
    ,rtype VARCHAR(50) NOT NULL ENCODE bytedict
    ,stype VARCHAR(25)          ENCODE bytedict
    ,sver VARCHAR(50)  NOT NULL ENCODE text255
    ,dmacd INTEGER              ENCODE delta32k
    ,reqnum INTEGER    NOT NULL ENCODE delta32k
    ,did VARCHAR(255)           ENCODE zstd
    ,"region" VARCHAR(10)       ENCODE lzo
)
DISTSTYLE EVEN
SORTKEY (kaid, eid, aid, "ts")
;

. . . 

DELETE FROM REQUESTS WHERE ID NOT IN ( 
   SELECT ID FROM (
      SELECT *, ROW_NUMBER() OVER 
         ( PARTITION BY DID,RID,RTYPE,TS ORDER BY ID ASC ) DUPLICATES 
      FROM REQUESTS 
   ) WHERE DUPLICATES=1
); COMMIT; 
票数 0
EN

Stack Overflow用户

发布于 2021-12-21 11:58:03

还有另一种解决方案可以真正避免数据重复,尽管它不像插入数据后删除重复数据那么简单。copy命令具有清单选项,用于指定要复制的文件

代码语言:javascript
复制
copy customer
from 's3://mybucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest; 

您可以构建一个lambda,它在每次运行copy命令之前都会生成一个新的清单文件。该lambda将比较已复制的文件和到达的新文件,并创建一个仅包含新文件的新清单,这样您就永远不会两次摄取相同的文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15701385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档