개요
Snowflake에서 외부 데이터를 다루기 위한 객체로 2024.07.05-[Snowflake] FILE FORMAT, 2024.07.08-[Snowflake] Stage에 대해서 알아보았다. 이번 글에서는 두 객체를 사용해 실제로 외부 데이터를 로드하는 COPY INTO 문에 대해서 적어둔다.
COPY INTO
COPY INTO 구문은 스테이징 된 파일에서 테이블로 데이터를 로드하는 구문으로, 로드하는 파일은 내부 스테이지, 외부 스테이지, 외부 저장소(S3, Google Cloud Storage, Azure) 등에 위치해 있어야 한다.
COPY INTO 구문은 일반적으로 데이터를 저장할 테이블, 데이터로 접근할 때 사용하는 Stage, 로드할 데이터 파일, 사용할 file format을 지정하여 사용한다.
COPY INTO my_table_name
FROM @like_a_window_into_an_s3_bucket
files = ( 'IF_I_HAD_A_FILE_LIKE_THIS.txt')
file_format = ( format_name='EXAMPLE_FILEFORMAT' );
아래 그림은 위의 COPY INTO 구문을 그림으로 표현한 것이다.
테스트
예시로 2024.07.08-[Snowflake] Stage에서 생성한 Stage GARDEN_PLANTS.FLOWERS.LIKE_A_WINDOW_INTO_AN_S3_BUCKET로부터 VEG_NAME_TO_SOIL_TYPE_PIPE.txt라는 파일을 로드해 보자.
1. File Format 생성
로드할 파일 데이터 형식에 맞게 File Format을 생성한다.
CREATE FILE FORMAT garden_plants.flowers.PIPECOLSEP_ONEHEADROW
TYPE = 'CSV'--csv is used for any flat file (tsv, pipe-separated, etc)
FIELD_DELIMITER = '|' --pipes as column separators
SKIP_HEADER = 1 --one header row to skip
;
2. 테이블 생성
데이터를 저장할 테이블을 생성한다.
CREATE OR REPLACE TABLE garden_plants.flowers.vegetable_details_soil_type (
plant_name varchar(25)
, soil_type number(1,0)
);
3. 데이터 로드
COPY INTO 문을 사용하여 데이터를 테이블로 저장한다.
COPY INTO garden_plants.flowers.vegetable_details_soil_type
FROM garden_plants.flowers.like_a_window_into_an_s3_bucket
files = ( 'VEG_NAME_TO_SOIL_TYPE_PIPE.txt')
file_format = ( format_name=garden_plants.flowers.PIPECOLSEP_ONEHEADROW );
4. 데이터 확인
SELECT *
FROM garden_plants.flowers.vegetable_details_soil_type;
외부 저장소에서 데이터 로드
Stage를 통하지 않고 외부 저장소에서 바로 데이터를 로드할 때는 FROM 절에 로드할 파일의 위치를 지정하여 COPY INTO 문을 사용한다.
COPY INTO garden_plants.flowers.vegetable_details_soil_type_2
FROM 's3://uni-lab-files/VEG_NAME_TO_SOIL_TYPE_PIPE.txt'
file_format = ( format_name=garden_plants.flowers.PIPECOLSEP_ONEHEADROW );
참고 문서
https://docs.snowflake.com/ko/sql-reference/sql/copy-into-table
https://docs.snowflake.com/ko/user-guide/data-load-external-tutorial-copy-into