2013-05-13 82 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中。