【问题标题】:COPY s3 files to Redshift table with IDENTITY column without EXPLICIT_IDS将 s3 文件复制到带有 IDENTITY 列且不带 EXPLICIT_IDS 的 Redshift 表
【发布时间】:2023-03-17 16:38:01
【问题描述】:

我有一堆 s3 文件想要复制到 Redshift(使用 AWS Data Pipelines 和 RedshiftCopyActivity)。挑战在于我的 s3 文件比目标 Redshift 表少一列。 表本身有“id”列 - 一个 IDENTITY 列,其值在插入期间自动生成。

我知道我应该/可以使用 RedshiftCopyActivity 的 transformSql 属性,但我未能构建有用的查询。执行总是给我一个错误:

Exception ERROR: cannot set an identity column to a value

更多细节: 标识列是表的第一列。

数据已成功插入到名为 staging 的表中,应该是这样。另外,我看到我的 transformSQL 已运行,并且数据被插入到名为 staging2 的表中。日志显示:

create temporary table staging2 as select myField1, myField2, ..., myFieldN from staging

但在那之后:

INSERT INTO target_table SELECT * FROM staging2

导致错误发生。

那么,我该如何解决这个问题并让 Redshift 忽略我提供的列少的事实? 也许解决方案可以将“id”列作为最后一个,我仍然没有尝试这个。老实说,我不喜欢这听起来 - 像非常脆弱的方法。

【问题讨论】:

    标签: amazon-web-services amazon-s3 copy amazon-redshift amazon-data-pipeline


    【解决方案1】:

    逗你的表表名

    id(身份)|名称(字符串)|地址(字符串)

    复制命令应该是这样的

    COPY table-name  
    Name , Address
    FROM data-source
    CREDENTIALS 'aws-auth-args';
    

    注意:复制的语法

    COPY table-name 
    [ column-list ]
    FROM data_source
    [ WITH ] CREDENTIALS [AS] 'aws-auth-args'
    [ [ FORMAT ] [ AS ] data_format ] 
    [ [ parameter [ argument ] [, ... ] ] 
    

    【讨论】:

    • 感谢您的回答,但我不得不问这对数据管道和transformSql有什么帮助?我不明白。
    【解决方案2】:

    最后,我无法使用 RedshiftCopyActivity 完成这项工作。 它总是抱怨如何无法将值设置为标识列。事件 transformSQL 参数没有帮助。

    适合我需要的解决方案使用了运行简单 shell 脚本的 ShellCommandActivity。 基本上,这个想法是在运行上述 shell 脚本的 EC2 上安装 PSQL,使用 PSQL 连接到 Redshift 并触发将数据从 S3 复制到 Redshift 表的 COPY 命令。

    使用 COPY 命令的标识列没有问题。

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多