2013-05-13 79 views
4

Amazon Redshift提供了使用「複製」命令從s3對象加載表格數據的功能。他們是使用複製命令的一種方式,但也爲每個插入的行設置了額外的「col = CONSTANT」。Amazon Redshift如何從s3複製並設置job_id

我想在每個複製的行上設置一個job_id(它不在源數據中),我認爲這將是一個恥辱,必須執行幾百萬個插入操作,這樣每行都有一個job屬性, 「複製」使我獲得了99%的性能。

也許有更聰明的解決方案?

回答

8

如果希望在單個COPY命令中添加的所有行具有相同的job_id值,則可以將數據複製到登臺表中,然後將job_id列添加到該表中,然後將登臺表中的所有數據插入到最終表所示:

CREATE TABLE destination_staging (LIKE destination); 
ALTER TABLE destination_staging DROP COLUMN job_id; 
COPY destination_staging FROM 's3://data/destination/(...)' (...) 
ALTER TABLE destination_staging ADD COLUM job_id INT DEFAULT 42; 
INSERT INTO destination SELECT * FROM destination_staging ORDER BY sortkey_column; 
DROP TABLE destination_staging; 
ANALYZE TABLE destination; 
VACUUM destination; 

分析和真空是沒有必要的,但爲了更新查詢分析器,並把所有新的數據到正確的位置強烈推薦。

+2

如果您嘗試同時加載多個作業(這是必需的),這會導致不一致的行爲。我想我們可以使用「destination_staging _ $ {jobId}」作爲表格,這樣可以保持直線。 – gbegley 2013-06-11 20:21:13

+0

@gbegley,這是正確的。您必須爲每個job_id創建一個單獨的臨時表。 – 2013-06-12 09:22:08

0

似乎沒有選擇使用COPY命令本身進行後處理/預處理。因此,您最好的選擇似乎是對您打算將COPY加入Redshift的文件進行預處理,添加jobid並將它們加載到Redshift中。