将 s3 文件复制到带有 IDENTITY 列且不带 EXPLICIT_IDS 的 Redshift 表
Posted
技术标签:
【中文标题】将 s3 文件复制到带有 IDENTITY 列且不带 EXPLICIT_IDS 的 Redshift 表【英文标题】:COPY s3 files to Redshift table with IDENTITY column without EXPLICIT_IDS 【发布时间】:2016-12-16 22:41:11 【问题描述】:我有一堆 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”列作为最后一个,我仍然没有尝试这个。老实说,我不喜欢这听起来 - 像非常脆弱的方法。
【问题讨论】:
【参考方案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 命令的标识列没有问题。
【讨论】:
以上是关于将 s3 文件复制到带有 IDENTITY 列且不带 EXPLICIT_IDS 的 Redshift 表的主要内容,如果未能解决你的问题,请参考以下文章