在redshift postgresql中我可以跳过具有复制功能的列

时间:2013-06-11 23:58:00

标签: postgresql amazon-redshift

  • 我有一个.csv表(t1),列为:亚马逊S3存储中的c1,c2,c3
  • 我想将其复制到amazon redshift中
  • 我创建了包含列的表:c1,c2,c3,其中所有列都可以为空
  • 我用命令复制:

    复制t1a(c1,c3) 来自t1

  • 我预计它会从t1复制c1和c3并将默认的空值放在c2中,这样t1a中的一行可能看起来像(c1_rowX,null,c3_rowX)。

  • 相反,我得到一个类型错误,因为它正在将来自t1的c2(字符串类型)数据复制到t1a的c3(int类型)中。

  • 当我没有指定列时,复制命令正常工作:

    复制t1a 来自t1

  • 我已经包含了一个指向redshift copy命令文档的链接:

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

  • 主要问题是我使用指定列时出现问题。感谢

2 个答案:

答案 0 :(得分:10)

如果要跳过预处理部分,可以将要跳过的列定义为CHAR(1),然后将TRUNCATECOLUMNS参数用于COPY命令:

CREATE TABLE t1a (
  c1,
  c2 CHAR(1),
  c3
);
COPY t1a FROM t1 TRUNCATECOLUMNS

TRUNCATECOLUMNS忽略导入期间比表模式中定义的更长的所有数据,因此该列中的所有数据都将被截断为1个字符。

这只是一个黑客,建议使用预处理输入文件,但有时候只需要黑客就可以了。

答案 1 :(得分:4)

COPY不直接支持详细的列映射,除非Amazon / ParAccel在其主帖中没有添加额外的PostgreSQL前缀。

在这种情况下,您通常要做的是脚本按摩/填充数据 - 读取CSV,根据需要进行转换,然后通过PostgreSQL连接将行发送到COPY ... FROM STDIN命令。

或者,您可以将整个原始CSV COPY放入表中,然后使用INSERT INTO ... SELECT将该数据转换为真实的目标表。