2013-05-13 6 views
4

Amazon Redshift는 "Copy"명령을 사용하여 s3 객체의 테이블 데이터를로드하는 기능을 제공합니다. 복사 명령을 사용하는 방법 일뿐 아니라 삽입 된 각 행에 대해 추가로 "col = CONSTANT"를 설정합니다.Amazon Redshift s3에서 복사하고 job_id를 설정하는 방법

각 복사 된 행에 job_id (원본 데이터에 없음)를 설정하고 싶습니다. 각 행에 작업 속성이 있으므로 단지 수백만 개의 삽입을 실행해야하는 것이 수치 스럽습니다. "복사"는 훨씬 나은 성능으로 저에게 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; 

분석하고 VACUUM이 필요하지만 높은 쿼리 분석기를 업데이트하고 올바른 위치에 모든 새로운 데이터를 입력하기 위해 권장하지 않습니다.

+2

동시에 여러 작업을로드하려고하면 일관성없는 동작이 발생할 수 있습니다. 나는 우리가 "destination_staging _ $ {jobId}"를 테이블로 사용할 수 있다고 가정합니다. – gbegley

+0

@gbegley, 맞습니다. 각 job_id에 대해 별도의 준비 테이블을 작성해야합니다. –

0

COPY 명령 자체로 게시/전처리를 수행하는 옵션이없는 것처럼 보입니다. 따라서 가장 좋은 옵션은 COPY을 Redshift로 보낼 파일에 대한 전처리 작업을 수행하고 작업 ID를 추가 한 다음 Redshift에로드하는 것입니다.