INSERT INTO - Amazon Athena

INSERT INTO

SELECT 원본 테이블에서 실행되는 쿼리 설명을 기반으로 하거나 해당 설명의 일부로 제공된 VALUES 세트를 기반으로 하는 대상 테이블에 새 행을 삽입합니다. 원본 테이블이 CSV 또는 JSON과 같은 한 가지 형식으로 된 기본 데이터를 기반으로 하고 대상 테이블이 Parquet 또는 ORC와 같은 다른 형식을 기반으로 할 때 INSERT INTO 쿼리를 사용하여 선택된 데이터를 대상 테이블의 형식에 맞춰 변환할 수 있습니다.

고려 사항 및 제한

Athena에서 INSERT 쿼리를 사용할 때는 다음 사항을 고려하세요.

  • Amazon S3에서 암호화된 기본 데이터가 포함된 테이블에서 INSERT 쿼리를 실행할 때 INSERT 쿼리가 작성하는 출력 파일은 기본적으로 암호화되지 않습니다. 암호화된 데이터가 포함된 테이블에 삽입하는 경우 INSERT 쿼리 결과를 암호화할 것을 권장합니다.

    콘솔을 사용한 쿼리 결과 암호화에 대한 자세한 내용은 Amazon S3에 저장된 Athena 쿼리 결과 암호화 단원을 참조하세요. AWS CLI 또는 Athena API에서 암호화를 사용하도록 설정하려면 StartQueryExecution 작업의 EncryptionConfiguration 속성을 사용해 필요에 따라 Amazon S3 암호화 옵션을 지정합니다.

  • INSERT INTO 문의 경우 예상 버킷 소유자 설정이 Amazon S3의 대상 테이블 위치에 적용되지 않습니다. 예상 버킷 소유자 설정은 Athena 쿼리 결과에 대해 지정한 Amazon S3 출력 위치에만 적용됩니다. 자세한 내용은 Athena 콘솔을 사용하여 쿼리 결과 위치 지정 단원을 참조하십시오.

  • ACID 준수 INSERT INTO 문은 Iceberg 테이블 데이터 업데이트INSERT INTO 단원을 참조하세요.

지원되는 형식 및 SerDes

다음 형식 및 SerDes를 사용하여 데이터에서 생성된 테이블에서 INSERT 쿼리를 실행할 수 있습니다.

데이터 형식 SerDe

Avro

org.apache.hadoop.hive.serde2.avro.AvroSerDe

Ion com.amazon.ionhiveserde.IonHiveSerDe

JSON

org.apache.hive.hcatalog.data.JsonSerDe

ORC

org.apache.hadoop.hive.ql.io.orc.OrcSerde

PARQUET

org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

텍스트 파일

org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

참고

CSV, TSV 및 사용자 지정 구분 기호로 구분된 파일이 지원됩니다.

버킷팅된 테이블은 지원되지 않음

INSERT INTO은(는) 버킷팅된 테이블에서 지원되지 않습니다. 자세한 내용은 분할 및 버킷팅 사용 단원을 참조하십시오.

연합 쿼리가 지원되지 않음

연합 쿼리에는 INSERT INTO가 지원되지 않습니다. 이를 실행하려고 하면 이 작업은 현재 외부 카탈로그에서 지원되지 않습니다(This operation is currently not supported for external catalogs)라는 오류 메시지가 표시될 수 있습니다. 연합 쿼리에 대한 자세한 내용은 Amazon Athena 페더레이션 쿼리 사용 섹션을 참조하세요.

분할

INSERT INTO 또는 CREATE TABLE AS SELECT 쿼리에 분할을 사용할 때 이 단원의 요점들을 고려하세요.

Limits

INSERT INTO 문은 대상 테이블에 최대 100개의 파티션 쓰기를 지원합니다. 100개 이상의 파티션이 있는 테이블에서 SELECT 절을 실행하면 SELECT 쿼리가 100개 이하의 파티션으로 제한되지 않는 한 쿼리가 실패합니다.

이 제한을 해결하는 방법에 대한 자세한 내용은 CTAS 및 INSERT INTO를 사용하여 100개 파티션 한도 문제 해결 단원을 참조하세요.

열 정렬

INSERT INTO 또는 CREATE TABLE AS SELECT 문은 분할된 열이 SELECT 문에서 프로젝션된 열 목록의 마지막 열이 될 것으로 예상합니다.

소스 테이블이 분할되지 않았거나 대상 테이블과 달리 다른 열에 분할된 경우 INSERT INTO destination_table SELECT * FROM source_table와 같은 쿼리는 소스 테이블의 마지막 열 값을 대상 테이블의 파티션 열 값으로 간주합니다. 분할되지 않은 테이블에서 분할된 테이블을 만들려고 할 때는 이 점에 유의해야 합니다.

리소스

INSERT INTO와 파티셔닝 사용에 관한 자세한 내용은 다음 리소스를 참조하세요.

Amazon S3에 작성되는 파일

Athena는 Amazon S3의 소스 데이터 위치에 파일을 INSERT 명령의 결과로서 작성합니다. 각 INSERT 작업은 기존 파일에 추가하는 게 아니라 새 파일을 생성합니다. 파일 위치는 테이블의 구조와 SELECT 쿼리(있는 경우)에 따라 달라집니다. Athena는 각 INSERT 쿼리에 대해 데이터 매니페스트 파일을 생성합니다. 매니페스트는 쿼리가 작성한 파일을 추적합니다. 이는 Amazon S3의 Athena 쿼리 결과에 저장됩니다. 자세한 내용은 쿼리 출력 파일 식별 단원을 참조하십시오.

트랜잭션이 많은 업데이트 방지

INSERT INTO를 사용하여 Amazon S3의 테이블에 행을 추가할 때 Athena는 기존 파일을 다시 쓰거나 수정하지 않습니다. 대신 행을 하나 이상의 새 파일로 씁니다. 작은 파일이 많은 테이블은 쿼리 성능을 저하시키고, PutObjectGetObject와 같은 쓰기 및 읽기 작업을 수행하면 Amazon S3에서 비용이 증가하므로 INSERT INTO 사용 시에는 다음 사항을 고려하세요.

  • 대량의 행 배치에서는 INSERT INTO 작업 실행 빈도를 줄이세요.

  • 데이터 모으기 양이 많은 경우 Amazon Data Firehose와 같은 서비스를 사용해 보세요.

  • INSERT INTO를 함께 사용하지 마세요. 대신 행을 큰 파일로 모아 Athena가 쿼리할 수 있도록 Amazon S3에 직접 업로드하세요.

분리된 파일 찾기

CTAS 또는 INSERT INTO 문이 실패하는 경우 분리된 데이터가 해당 데이터 위치에 남을 수 있고 후속 쿼리에서 이 데이터를 읽을 수 있습니다. 검사 또는 삭제할 분리된 파일을 찾으려면 Athena에서 제공하는 데이터 매니페스트 파일을 사용하여 작성할 파일 목록을 추적할 수 있습니다. 자세한 내용은 쿼리 출력 파일 식별DataManifestLocation를 참조하세요.

INSERT INTO...SELECT

쿼리가 하나의 테이블 source_table에서 실행되도록 지정하면 두 번째 테이블 destination_table에 삽입할 행이 결정됩니다. SELECT 쿼리가 source_table의 열을 지정하는 경우 해당 열은 destination_table의 열과 정확하게 일치해야 합니다.

SELECT 쿼리에 대한 자세한 내용은 SELECT 단원을 참조하세요.

시놉시스

INSERT INTO destination_table SELECT select_query FROM source_table_or_view

예제

vancouver_pageviews 테이블의 모든 행을 선택한 다음 canada_pageviews 테이블에 삽입합니다.

INSERT INTO canada_pageviews SELECT * FROM vancouver_pageviews;

2019-07-01에서 2019-07-31 사이의 값이 포함된 date 열이 있는 vancouver_pageviews 테이블의 행을 선택한 다음 canada_july_pageviews에 삽입합니다.

INSERT INTO canada_july_pageviews SELECT * FROM vancouver_pageviews WHERE date BETWEEN date '2019-07-01' AND '2019-07-31';

country 열에 usa의 값이 포함된 행에서 cities_world 테이블의 citystate 열의 값을 선택한 다음 cities_usa 테이블의 citystate 열에 삽입합니다.

INSERT INTO cities_usa (city,state) SELECT city,state FROM cities_world WHERE country='usa'

INSERT INTO...VALUES

열 및 값을 지정하여 기존 테이블에 행을 삽입합니다. 지정된 열 및 관련 데이터 형식은 대상 테이블의 열 및 데이터 형식과 정확하게 일치해야 합니다.

중요

Athena는 각 INSERT 작업에 대해 파일을 생성하기 때문에 VALUES를 사용하여 행을 삽입하는 것은 권장하지 않습니다. 이로 인해 작은 파일이 많이 생성되어 테이블의 쿼리 성능이 저하될 수 있습니다. INSERT 쿼리가 생성하는 파일을 식별하려면 데이터 매니페스트 파일을 검사합니다. 자세한 내용은 쿼리 결과 및 최근 쿼리 작업 단원을 참조하십시오.

시놉시스

INSERT INTO destination_table [(col1,col2,...)] VALUES (col1value,col2value,...)[, (col1value,col2value,...)][, ...]

예제

다음 예시에서 도시 테이블에는 id, city, state, state_motto의 세 가지 열이 있습니다. id 열은 INT 형식이고 기타 모든 열은 VARCHAR 형식입니다.

cities 테이블에 단일 행 하나를 삽입하고 모든 열 값을 지정합니다.

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')

cities 테이블에 행 두 개를 삽입합니다.

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'), (3,'Boise','ID','Esto perpetua')