Amazon redshift 从S3重新加载卸载的表数据
使用默认分隔符“|”将~500 gig表卸载到S3。命令看起来像这样Amazon redshift 从S3重新加载卸载的表数据,amazon-redshift,Amazon Redshift,使用默认分隔符“|”将~500 gig表卸载到S3。命令看起来像这样 UNLOAD ('select * from some_table') TO 's3://some-path/unloaded-tables/some-table/' CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc' MANIFEST; 我正试图使用如下命令将此数据重新加载到某个_表中 COPY some_table FROM 's3://som
UNLOAD ('select * from some_table')
TO 's3://some-path/unloaded-tables/some-table/'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
MANIFEST;
我正试图使用如下命令将此数据重新加载到某个_表中
COPY some_table
FROM 's3://some-path/unloaded-tables/some-table/manifest'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
MANIFEST
DELIMITER '|';
测试是在数据的子集上运行的,以确保它是可重新加载的。然而,事实证明,数据集中的一列可能包含管道(大约有20%的记录被删除)。测试集中没有此类数据
现在,当尝试加载数据时,包含管道的记录无法正确解析
我会感到惊讶的是,UNLOAD命令在卸载时没有逃逸记录中的分隔符,但这可能是幼稚的
除了从s3下载每个文件并尝试手动修复问题的英雄程序之外,我还有什么想法可以解决这个问题吗?我祈祷有一个神奇的复制命令参数,这将有助于这里 如果您可以将此数据加载到其他表中一次,然后将其拆分到其他表中,这就是您可以做的- 示例-假设您的数据有3列和2个管道,但其中一个有一个额外的管道。 然后用“|”分隔符将其卸载到S3
insert into T2
select split_part(X,"|",1),
split_part(X,"|",2),
split_part(X,"|",3)
from T1
where len(X) - len(replace(X,"|","")) = 3;
insert into T2
select split_part(X,"|",1),
split_part(X,"|",2),
split_part(X,"|",3) || split_part(X,"|",4)
from T1
where len(X) - len(replace(X,"|","")) = 4;
len(X)-len(替换(X,“|”和“”)=3代码>
显示单元格中的管道数
|
是串联
如果您有任何问题,请告诉我。如果您可以将此数据加载到其他表中一次,然后将其拆分到其他表中,这就是您可以做的-
示例-假设您的数据有3列和2个管道,但其中一个有一个额外的管道。
然后用“|”分隔符将其卸载到S3
创建一个具有单列和长度varchar(max)的表(T1)
使用您确定不会出现在数据中的分隔符(如\t或\001(^a))将卸载的数据复制到此表中
这就是表中的数据-
创建具有所需列数和数据类型的新表(T2)
对于除Deliter之外没有额外管道的行,请插入到新表中
查询应该是这样的-
insert into T2
select split_part(X,"|",1),
split_part(X,"|",2),
split_part(X,"|",3)
from T1
where len(X) - len(replace(X,"|","")) = 3;
对于具有除分隔符以外的管道的行,请将拆分合并为一个并插入T2
insert into T2
select split_part(X,"|",1),
split_part(X,"|",2),
split_part(X,"|",3) || split_part(X,"|",4)
from T1
where len(X) - len(replace(X,"|","")) = 4;
注:
len(X)-len(替换(X,“|”和“”)=3代码>
显示单元格中的管道数
|
是串联
如果您有任何问题,请告诉我。创建另一个卸载:
UNLOAD ('select * from some_table')
TO 's3://some-path/unloaded-tables/some-table/'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
DELIMITER '|' ADDQUOTES;
您的copy
命令如下所示:
COPY some_table
FROM 's3://some-path/unloaded-tables/some-table/manifest'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
REMOVEQUOTES
DELIMITER '|';
未卸载的数据将在每个列值周围有引号,如果引用为引号,它将不考虑管道作为定界符。
< P>创建另一个卸载:
UNLOAD ('select * from some_table')
TO 's3://some-path/unloaded-tables/some-table/'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
DELIMITER '|' ADDQUOTES;
UNLOAD ('statement')
TO 's3://bucket'
CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...'
GZIP
DELIMITER as '|'
ESCAPE ADDQUOTES ALLOWOVERWRITE;
您的copy
命令如下所示:
COPY some_table
FROM 's3://some-path/unloaded-tables/some-table/manifest'
CREDENTIALS 'aws_access_key_id=xyz; aws_secret_access_key=abc'
REMOVEQUOTES
DELIMITER '|';
您的卸载数据将在每个列值周围都有引号,如果引号在引号中,它将不考虑管作为定界符。
< P>您必须告诉ReSturn在卸载和复制命令中明确地划出定界符,并且还包括引号中的所有字段。
UNLOAD ('statement')
TO 's3://bucket'
CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...'
GZIP
DELIMITER as '|'
ESCAPE ADDQUOTES ALLOWOVERWRITE;
然后复制
COPY table
FROM 's3path'
CREDENTIALS 'credentials'
GZIP REMOVEQUOTES ESCAPE DELIMITER '|'
FILLRECORD EMPTYASNULL BLANKSASNULL TIMEFORMAT 'auto'
COMPUPDATE off STATUPDATE off;
您必须告诉Redshift在unload和copy命令中显式转义分隔符,并将所有字段括在引号中
UNLOAD ('statement')
TO 's3://bucket'
CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...'
GZIP
DELIMITER as '|'
ESCAPE ADDQUOTES ALLOWOVERWRITE;
然后复制
COPY table
FROM 's3path'
CREDENTIALS 'credentials'
GZIP REMOVEQUOTES ESCAPE DELIMITER '|'
FILLRECORD EMPTYASNULL BLANKSASNULL TIMEFORMAT 'auto'
COMPUPDATE off STATUPDATE off;
谢谢,但不幸的是,第一次卸载后表被截断了。谢谢,但不幸的是,第一次卸载后表被截断了。谢谢,我现在意识到了。谢谢,我现在意识到了。如果您好奇,我能够恢复最初生成表的原始日志级数据,并基于此重新生成表。如果您好奇,我能够恢复最初生成表的原始日志级数据,并基于此重新生成表。