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

Elm*_*Elm 8 postgresql amazon-redshift

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

    从t1复制t1a(c1,c3)

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

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

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

    从t1复制t1a

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

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

  • 主要问题是我使用指定列的问题.谢谢

Tom*_*icz 11

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

CREATE TABLE t1a (
  c1,
  c2 CHAR(1),
  c3
);
COPY t1a FROM t1 TRUNCATECOLUMNS
Run Code Online (Sandbox Code Playgroud)

TRUNCATECOLUMNS会忽略在导入期间在表模式长于定义的所有数据,因此在该列中的所有数据将被截短成1个字符.

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


Cra*_*ger 5

不直接支持详细的列映射COPY,除非 Amazon/ParAccel 在其 PostgreSQL 分支中添加了一些不在主线中的额外内容。

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

或者,您可以将COPY整个原始 CSV 转换为一个表,然后将该数据转换INSERT INTO ... SELECT为真正的目标表。