1

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

我知道我应该/可以使用RedSiftCopyActivity的transformSql属性,但我在构造有用的查询时失败。执行总是返回我一个错误:

Exception ERROR: cannot set an identity column to a value 

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

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

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

但之后谈到:

INSERT INTO target_table SELECT * FROM staging2 

这将导致发生错误。

那么,我该如何解决这个问题,并使Redshift忽略了我提供一列少的事实? 可能的解决办法可能是将“id”列作为最后一个列,但我仍然没有尝试这个。说实话,我不喜欢它的声音 - 就像非常脆弱的做法。

回答

0

最后,我不能让这个使用RedshiftCopyActivity工作。 它总是抱怨价值不能被设置为标识列。事件transformSQL参数没有帮助。

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

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

0

有趣的表格表名

id(identity)名称(字符串)|地址(字符串)

复制命令想

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 ] [, ... ] ] 
+0

感谢您的答案,但我不得不问,这如何帮助数据管道和transformSql?我不明白这一点。 – ezamur

相关问题