我用命令复制:
复制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
答案 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
将该数据转换为真实的目标表。