Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon redshift 从S3重新加载卸载的表数据_Amazon Redshift - Fatal编程技术网

Amazon redshift 从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

使用默认分隔符“|”将~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://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

  • 创建一个具有单列和长度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
    显示单元格中的管道数

    |
    是串联


    如果您有任何问题,请告诉我。

    如果您可以将此数据加载到其他表中一次,然后将其拆分到其他表中,这就是您可以做的-

    示例-假设您的数据有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;
    

    谢谢,但不幸的是,第一次卸载后表被截断了。谢谢,但不幸的是,第一次卸载后表被截断了。谢谢,我现在意识到了。谢谢,我现在意识到了。如果您好奇,我能够恢复最初生成表的原始日志级数据,并基于此重新生成表。如果您好奇,我能够恢复最初生成表的原始日志级数据,并基于此重新生成表。