在 redshift postgresql 中,我可以跳过带有复制功能的列吗[英] in redshift postgresql can I skip columns with the copy function

本文是小编为大家收集整理的关于在 redshift postgresql 中,我可以跳过带有复制功能的列吗的处理方法,想解了在 redshift postgresql 中,我可以跳过带有复制功能的列吗的问题怎么解决?在 redshift postgresql 中,我可以跳过带有复制功能的列吗问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

    复制 t1a (c1,c3)从 t1

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

  • 相反,我收到了类型错误,因为它正在将 c2(字符串类型)数据从 t1 转换为 t1a 的 c3(整数类型).

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

    复制t1a从 t1

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

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

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

推荐答案

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

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

TRUNCATECOLUMNS 会在导入期间忽略所有比表架构中定义的长度更长的数据,因此该列中的所有数据都将被截断为 1 个字符.

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

其他推荐答案

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

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

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

本文地址:https://www.itbaoku.cn/post/1763765.html