我正在将数据从亚马逊S3复制到红移。在此过程中,我需要避免再次加载相同的文件。我的红移表没有任何独特的约束。有没有办法使用copy命令来实现这一点?
http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html
我尝试添加唯一约束并将列设置为主键,但没有成功。Redshift似乎不支持唯一/主键约束。
发布于 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
发布于 2021-03-07 09:26:34
我们每周删除重复项,但您也可以在@Kyle提到的加载事务期间执行此操作。此外,这确实需要存在一个自动生成的ID列作为删除的最终目标:
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;
例如:
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;
发布于 2021-12-21 11:58:03
还有另一种解决方案可以真正避免数据重复,尽管它不像插入数据后删除重复数据那么简单。copy命令具有清单选项,用于指定要复制的文件
copy customer
from 's3://mybucket/cust.manifest'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
您可以构建一个lambda,它在每次运行copy命令之前都会生成一个新的清单文件。该lambda将比较已复制的文件和到达的新文件,并创建一个仅包含新文件的新清单,这样您就永远不会两次摄取相同的文件
https://stackoverflow.com/questions/15701385
复制相似问题