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

    从 t1 复制 t1a (c1,c3)

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

  • 相反,我收到了一个类型错误,因为它将 c2(字符串类型)数据从 t1 处理到 t1a 的 c3(int 类型)。

  • 当我不指定列时,复制命令可以正常工作:

    从 t1 复制 t1a

  • 我已经包含了红移复制命令文档的链接:

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

  • 主要问题是我使用指定列存在问题。谢谢
4

2 回答 2

12

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

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

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

这只是一个 hack,建议对输入文件进行预处理,但有时只需要一个 hack。

于 2013-06-12T08:56:38.400 回答
4

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

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

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

于 2013-06-12T00:03:17.300 回答