AWS Redshift alter append 命令不适用于插入数据

Posted

技术标签:

【中文标题】AWS Redshift alter append 命令不适用于插入数据【英文标题】:AWS Redshift alter append command not working for inserting data 【发布时间】:2017-06-21 09:10:51 【问题描述】:

我必须定期将记录插入 Redshift 表。 所以我选择了将 s3 数据复制到 stage 表中,然后使用 alter append 命令将 stage 表数据附加到实际表中的策略。 就我而言。

阶段表 - URL_DATA_TEMP

实际表 - URL_METADATA

现在我使用相同的命令创建了两个表,并且只更改了表名。 例如:

CREATE TABLE _360_model.URL_METADATA
(
URL VARCHAR(8000),
URL_MD5 VARCHAR(300),
INDEX VARCHAR(200),
ASSET_TYPE VARCHAR(200)
);

CREATE TABLE _360_model.URL_DATA_TEMP
(
URL VARCHAR(8000),
URL_MD5 VARCHAR(300),
INDEX VARCHAR(200),
ASSET_TYPE VARCHAR(200)
);

当我尝试使用以下附加命令时,它仍然会抱怨。

alter table _360_model.URL_METADATA append from _360_model.URL_DATA_TEMP;

error:  Columns don't match.
code:      8001
context:   Column "asset_type" has different attributes in the source table 
and the target table. Columns with the same name must have the same 
attributes in both tables.

当我使用几乎相同的命令创建表时,我无法理解,列结构怎么可能不同。

【问题讨论】:

列名 INDEX 是否破坏了? INDEX 是保留字,但可以带引号吗? 您是否检查过列编码、分配键等是否相同?尝试运行 select trim(tablename) as table, "column", trim(type) as type, encoding, distkey, sortkey, "notnull" from pg_table_def where tablename in ('URL_METADATA', 'URL_DATA_TEMP');比较它们。 您的查询对我来说工作正常,您应该检查您创建表的方式是否与您在此处提到的方式相同。 【参考方案1】:

这可能来自列压缩差异。在复制命令中,您是否使用如下所示的“COMPUPDATE ON”选项?如果是这样,很可能您的临时表的列压缩选项与您的目标表不同。

copy <table name> from 's3://<data location>'
CREDENTIALS <creds>
region <region>
GZIP
CSV
IGNOREHEADER 1
TIMEFORMAT 'auto' manifest
COMPUPDATE ON;

我遇到了类似的问题并做了以下操作。

1) 使用复制命令加载数据并打开 COMPUPDATE

见:http://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-load.html#copy-compupdate

2) 加载完成后,使用下面的查询查看应用的自动压缩。

select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = '<table name>';

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

3) 使用与临时表相同的压缩来重新创建目标表。

create table <target table name> (
    <column name> <type> encode <encoding>,
    ...
)

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

其他表属性(例如 sortkey)需要在您的暂存表和目标表中匹配。

【讨论】:

【参考方案2】:

我无法使用您提供的 SQL 重新创建问题(使用 psql)。

尝试使用psql 运行您的 SQL,以查看您的工具是否以某种方式更改了提交的 SQL。

【讨论】:

以上是关于AWS Redshift alter append 命令不适用于插入数据的主要内容,如果未能解决你的问题,请参考以下文章

在 REDSHIFT 中的 ALTER 语句中连接字符串(语法错误)

ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予

Redshift Spectrum 'alter table add partition' 安全性

无法从 AWS lambda 连接 AWS redshift

通过 AWS Glue 执行 Redshift 过程

AWS 在 VPC 中访问 Redshift