INSERT(외부 테이블)
AWS Glue, AWS Lake Formation 또는 Apache Hive 메타스토어와 같은 외부 카탈로그의 기존 외부 테이블에 SELECT 쿼리의 결과를 삽입합니다. 외부 카탈로그 및 Amazon S3와 상호 작용하려면 CREATE EXTERNAL SCHEMA 명령에 사용된 것과 동일한 AWS Identity and Access Management(IAM) 역할을 사용합니다.
분할되지 않은 테이블의 경우 INSERT(외부 테이블) 명령은 지정된 테이블 속성과 파일 형식에 따라 테이블에 정의된 Amazon S3 위치에 데이터를 작성합니다.
분할된 테이블의 경우 INSERT(외부 테이블)는 테이블에 지정된 파티션 키에 따라 Amazon S3 위치에 데이터를 작성합니다. 또한 INSERT 작업이 완료된 후 외부 카탈로그에 새 파티션을 자동으로 등록합니다.
트랜잭션 블록(BEGIN ... END) 내에서는 INSERT(외부 테이블)를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 직렬화 가능 격리 단원을 참조하십시오.
구문
INSERT INTO external_schema.table_name { select_statement }
파라미터
- external_schema.table_name
-
기존 외부 스키마 및 삽입할 대상 외부 테이블의 이름입니다.
- select_statement
-
쿼리를 정의하여 외부 테이블에 하나 이상의 행을 삽입하는 문입니다. 쿼리가 생성하는 모든 행은 테이블 정의에 따라 텍스트 또는 Parquet 형식으로 Amazon S3에 작성됩니다. 쿼리는 외부 테이블의 열 데이터 형식과 호환되는 열 목록을 반환해야 합니다. 그러나 열 이름은 일치하지 않아도 됩니다.
사용 노트
SELECT 쿼리의 열 수는 데이터 열 및 파티션 열의 합계와 같아야 합니다. 각 데이터 열의 위치 및 데이터 형식은 외부 테이블의 위치 및 데이터 형식과 일치해야 합니다. 파티션 열의 위치는 CREATE EXTERNAL TABLE 명령에 정의된 것과 동일한 순서로 SELECT 쿼리의 끝에 있어야 합니다. 열 이름은 일치하지 않아도 됩니다.
경우에 따라 AWS Glue 데이터 카탈로그 또는 Hive 메타스토어에 대해 INSERT(외부 테이블) 명령을 실행할 수 있습니다. AWS Glue의 경우 외부 스키마를 생성하는 데 사용되는 IAM 역할은 Amazon S3 및 AWS Glue에 대한 읽기 및 쓰기 권한이 모두 있어야 합니다. AWS Lake Formation 카탈로그를 사용하는 경우 이 IAM 역할이 새 Lake Formation 테이블의 소유자가 됩니다. 이 IAM 역할에는 최소한 다음 권한이 있어야 합니다.
-
외부 테이블에 대한 SELECT, INSERT, UPDATE 권한
-
외부 테이블의 Amazon S3 경로에 대한 데이터 위치 권한
파일 이름이 고유한지 확인하기 위해 Amazon Redshift에서는 기본적으로 Amazon S3에 업로드된 각 파일의 이름에 다음 형식을 사용합니다.
.<date>
_<time>
_<microseconds>
_<query_id>
_<slice-number>
_part_<part-number>
.<format>
예를 들면, 20200303_004509_810669_1007_0001_part_00.parquet
입니다.
INSERT(외부 테이블) 명령을 실행할 때 다음 사항을 고려하십시오.
-
PARQUET 또는 TEXTFILE이 아닌 다른 형식의 외부 테이블은 지원되지 않습니다.
-
이 명령은 'write.parallel', 'write.maxfilesize.mb', 'compression_type’, 'serialization.null.format' 같은 기존 테이블 속성을 지원합니다. 이러한 값을 업데이트하려면 ALTER TABLE SET TABLE PROPERTIES 명령을 실행합니다.
-
'numRows' 테이블 속성은 자동으로 INSERT 작업의 끝으로 업데이트됩니다. CREATE EXTERNAL TABLE AS 작업에 의해 생성되지 않은 경우 테이블 속성을 정의하거나 테이블에 추가해야 합니다.
-
LIMIT 절은 외부 SELECT 쿼리에서 지원되지 않습니다. 대신 중첩 LIMIT 절을 사용합니다.
-
STL_UNLOAD_LOG 테이블을 사용하여 각 INSERT(외부 테이블) 작업에서 Amazon S3에 작성된 파일을 추적할 수 있습니다.
Amazon Redshift는 INSERT(외부 테이블)에 대해 Amazon S3 Standard 암호화만 지원합니다.
INSERT(외부 테이블) 예
다음 예에서는 SELECT 문의 결과를 외부 테이블에 삽입합니다.
INSERT INTO spectrum.lineitem SELECT * FROM local_lineitem;
다음 예에서는 정적 분할을 사용하여 분할된 외부 테이블에 SELECT 문의 결과를 삽입합니다. 파티션 열은 SELECT 문에서 하드 코딩됩니다. 파티션 열은 쿼리의 끝에 있어야 합니다.
INSERT INTO spectrum.customer SELECT name, age, gender, 'May', 28 FROM local_customer;
다음 예에서는 동적 분할을 사용하여 분할된 외부 테이블에 SELECT 문의 결과를 삽입합니다. 파티션 열은 하드 코딩되지 않습니다. 데이터는 기존 파티션 폴더에 자동으로 추가되거나 새 파티션이 추가된 경우 새 폴더에 추가됩니다.
INSERT INTO spectrum.customer SELECT name, age, gender, month, day FROM local_customer;