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

相關問題