자습서: COPY를 사용하여 Amazon S3에서 대량 로드¶
소개¶
이 자습서에서는 기존 Amazon Simple Storage Service(Amazon S3) 버킷의 파일에서 테이블로 데이터를 로드하는 방법을 설명합니다. 이 자습서에서는 다음에 대해 설명합니다.
데이터 파일을 설명하는 명명된 파일 형식을 생성합니다.
명명된 스테이지 오브젝트를 생성합니다.
S3 버킷에 있는 데이터를 Snowflake 테이블로 로드합니다.
데이터 파일의 오류를 해결합니다.
이 자습서에서는 CSV 및 JSON 데이터를 로드하는 방법에 대해 설명합니다.
전제 조건¶
이 자습서에서는 다음과 같이 가정합니다.
Amazon Web Services(AWS)를 사용하도록 구성된 Snowflake 계정과 데이터베이스, 테이블 및 가상 웨어하우스 오브젝트를 만드는 데 필요한 권한을 부여하는 역할을 가진 사용자가 있습니다.
SnowSQL이 설치되어 있습니다.
이러한 요구 사항을 충족하기 위한 지침은 20분만에 Snowflake 시작하기 섹션을 참조하십시오.
Snowflake는 이 자습서에서 사용할 공용 Amazon S3 버킷의 샘플 데이터 파일을 제공합니다. 하지만 시작하기 전에 이 자습서에 따라 실습하기 위한 데이터베이스, 테이블, 가상 웨어하우스를 만들어야 합니다. 이들은 대부분의 Snowflake 활동에 필요한 기본 Snowflake 오브젝트입니다.
샘플 데이터 파일 정보¶
Snowflake는 공용 S3 버킷에서 스테이징된 샘플 데이터 파일을 제공합니다.
참고
일반적인 사용에서는 AWS 관리 콘솔, AWS 명령줄 인터페이스 또는 이에 상응하는 클라이언트 애플리케이션을 사용하여 자체 데이터 파일을 스테이징합니다. 지침과 관련해서는 Amazon Web Services 설명서를 참조하십시오.
샘플 데이터 파일에는 다음 형식의 샘플 연락처 정보가 포함됩니다.
CSV 헤더 행과 5개의 레코드를 포함하는 파일. 필드 구분 기호는 파이프(
|
) 문자입니다. 다음 예에서는 헤더 행과 레코드 한 개를 보여줍니다.ID|lastname|firstname|company|email|workphone|cellphone|streetaddress|city|postalcode 6|Reed|Moses|Neque Corporation|eget.lacus@facilisis.com|1-449-871-0780|1-454-964-5318|Ap #225-4351 Dolor Ave|Titagarh|62631
배열 1개과 오브젝트 3개가 포함된 JSON 형식의 단일 파일입니다. 다음은 오브젝트 중 하나를 포함하는 배열의 예입니다.
[ { "customer": { "address": "509 Kings Hwy, Comptche, Missouri, 4848", "phone": "+1 (999) 407-2274", "email": "blankenship.patrick@orbin.ca", "company": "ORBIN", "name": { "last": "Patrick", "first": "Blankenship" }, "_id": "5730864df388f1d653e37e6f" } }, ]
데이터베이스, 테이블, 웨어하우스 만들기¶
다음 문을 실행하여 이 자습서에 따라 실습하는 데 필요한 데이터베이스, (csv 데이터와 json 데이터를 위한) 테이블 두 개, 가상 웨어하우스를 만듭니다. 자습서를 마친 후 이러한 오브젝트를 삭제할 수 있습니다.
CREATE OR REPLACE DATABASE mydatabase;
CREATE OR REPLACE TEMPORARY TABLE mycsvtable (
id INTEGER,
last_name STRING,
first_name STRING,
company STRING,
email STRING,
workphone STRING,
cellphone STRING,
streetaddress STRING,
city STRING,
postalcode STRING);
CREATE OR REPLACE TEMPORARY TABLE myjsontable (
json_data VARIANT);
CREATE OR REPLACE WAREHOUSE mywarehouse WITH
WAREHOUSE_SIZE='X-SMALL'
AUTO_SUSPEND = 120
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED=TRUE;
다음 사항을 참고하십시오.
CREATE DATABASE
문으로 데이터베이스를 만듭니다. 데이터베이스에는 ‘public’이라는 스키마가 자동으로 포함됩니다.CREATE TABLE
문으로 CSV 및 JSON 데이터의 대상 테이블을 만듭니다. 이 테이블은 임시 테이블로, 사용자 세션 기간에만 지속되며 다른 사용자에게는 보이지 않습니다.CREATE WAREHOUSE
문으로 처음에 일시 중단되는 웨어하우스를 만듭니다. 또한 이 문으로AUTO_RESUME = true
가 설정되어, 컴퓨팅 리소스가 필요한 SQL 문을 실행할 때 웨어하우스를 자동으로 시작하게 됩니다.
파일 형식 오브젝트 만들기¶
S3 버킷에서 테이블로 데이터 파일을 로드할 때 파일의 형식을 설명하고 파일의 데이터를 해석하고 처리하는 방법을 지정해야 합니다. 예를 들어, CSV 파일에서 파이프로 구분된 데이터를 로드하는 경우 파일이 파이프 기호가 있는 CSV 형식을 구분 기호로 사용하도록 지정해야 합니다.
COPY INTO <테이블> 명령을 실행할 때 이 형식 정보를 지정합니다. 이 정보를 명령의 옵션으로 지정하거나(예: TYPE = CSV
, FIELD_DELIMITER = '|'
등) 이 형식 정보를 포함하는 파일 형식 오브젝트를 지정할 수 있습니다. CREATE FILE FORMAT 명령을 사용하여 명명된 파일 형식 오브젝트를 만들 수 있습니다.
이 단계에서는 이 자습서에 제공된 샘플 CSV 및 JSON 데이터의 데이터 형식을 설명하는 파일 형식 오브젝트를 만듭니다.
CSV 데이터에 대한 파일 형식 오브젝트 만들기¶
CREATE FILE FORMAT 명령을 실행하여 mycsvformat
파일 형식을 만듭니다.
CREATE OR REPLACE FILE FORMAT mycsvformat
TYPE = 'CSV'
FIELD_DELIMITER = '|'
SKIP_HEADER = 1;
여기서
TYPE = 'CSV'
는 원본 파일 형식 유형을 나타냅니다. CSV는 기본 파일 형식 유형입니다.FIELD_DELIMITER = '|'
는 필드 구분 기호인 ‘|’ 문자를 나타냅니다. 기본값은 ‘,’입니다.SKIP_HEADER = 1
은 원본 파일에 헤더 행이 한 개 포함된다는 뜻입니다. COPY 명령은 데이터를 로드할 때 이 헤더 행을 건너뜁니다. 기본값은 0입니다.
JSON 데이터에 대한 파일 형식 오브젝트 만들기¶
CREATE FILE FORMAT 명령을 실행하여 myjsonformat
파일 형식을 만듭니다.
CREATE OR REPLACE FILE FORMAT myjsonformat TYPE = 'JSON' STRIP_OUTER_ARRAY = TRUE;
여기서
TYPE = 'JSON'
은 원본 파일 형식 유형을 나타냅니다.STRIP_OUTER_ARRAY = TRUE
는 COPY 명령에 대해 데이터를 테이블로 로드할 때 대괄호([])를 제외하도록 지시합니다.
스테이지 오브젝트 만들기¶
스테이지는 파일의 데이터를 테이블에 로드할 수 있도록 데이터 파일이 저장되는 위치(즉, “스테이징되는 위치”)를 지정합니다. 명명된 외부 스테이지 는 Snowflake에서 관리하는 클라우드 저장소 위치입니다. 외부 스테이지는 S3 버킷에 저장된 데이터 파일을 참조합니다. 이 경우 자습서를 완료하기 위해 필요한 샘플 데이터 파일을 참조하는 스테이지를 생성합니다.
여러 사용자 또는 프로세스가 파일을 업로드하도록 하려는 경우 명명된 외부 스테이지를 만들면 유용합니다. 자신만 로드하거나 단일 테이블에만 로드하도록 데이터 파일을 스테이징할 계획이라면 자신의 사용자 스테이지 또는 테이블 스테이지를 사용하는 쪽을 선택할 수 있습니다. 자세한 내용은 Amazon S3에서 대량 로드 섹션을 참조하십시오.
이 단계에서는 다양한 유형의 샘플 데이터 파일에 대해 명명된 스테이지를 만듭니다.
CSV 데이터 파일을 위한 스테이지 만들기¶
CREATE STAGE를 실행하여 my_csv_stage
스테이지를 만듭니다.
CREATE OR REPLACE STAGE my_csv_stage
FILE_FORMAT = mycsvformat
URL = 's3://snowflake-docs';
JSON 데이터 파일을 위한 스테이지 만들기¶
CREATE STAGE를 실행하여 my_json_stage
스테이지를 만듭니다.
CREATE OR REPLACE STAGE my_json_stage
FILE_FORMAT = myjsonformat
URL = 's3://snowflake-docs';
참고
일반적으로 개인 데이터 파일을 가리키는 스테이지를 생성하는 경우 계정 관리자(예: ACCOUNTADMIN 역할 사용자)가 CREATE STORAGE INTEGRATION 를 사용하여 생성한 저장소 통합 또는 전역 CREATE INTEGRATION 권한이 있는 역할을 참조합니다.
CREATE OR REPLACE STAGE external_stage FILE_FORMAT = mycsvformat URL = 's3://private-bucket' STORAGE_INTEGRATION = myint;
데이터를 대상 테이블로 복사¶
Execute COPY INTO <테이블> to load staged data into the target tables.
CSV¶
To load the data from the sample CSV files:
Start by loading the data from one of the files in the
/tutorials/dataloading/
prefix (folder) namedcontacts1.csv
in themycsvtable
table. Execute the following:COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/contacts1.csv ON_ERROR = 'skip_file';
여기서
The
FROM
clause specifies the location of the staged data file (stage name followed by the file name).ON_ERROR = 'skip_file'
절은 COPY 명령 실행 시 파일에서 오류가 발생할 때 수행해야 하는 동작을 지정합니다. In this case, when the command encounters a data error on any of the records in a file, it skips the file. If you do not specify an ON_ERROR clause, the default isabort_statement
, which aborts the COPY command on the first error encountered on any of the records in a file.
The COPY command returns a result showing the name of the file copied and related information:
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts1.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
mycsvtable
테이블의 스테이징된 파일 중 나머지를 로드합니다.다음 예에서는 패턴 일치를 사용하여 정규식
.*contacts[1-5].csv
와 일치하는 파일의 데이터를mycsvtable
테이블로 로드합니다.COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/ PATTERN='.*contacts[1-5].csv' ON_ERROR = 'skip_file';
여기서
PATTERN
절은 명령이 이 정규식(.*contacts[1-5].csv
)과 일치하는 파일 이름에서 데이터를 로드하도록 지정합니다.The COPY command returns a result showing the name of the file copied and related information:
+---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts2.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts3.csv | LOAD_FAILED | 5 | 0 | 1 | 2 | Number of columns in file (11) does not match that of the corresponding table (10), use file format option error_on_column_count_mismatch=false to ignore this error | 3 | 1 | "MYCSVTABLE"[11] | | s3://snowflake-docs/tutorials/dataloading/contacts4.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts5.csv | LOADED | 6 | 6 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
결과에서 다음 주요 사항을 참고하십시오.
이미 로드한 데이터이므로
contacts1.csv
의 데이터는 무시됩니다.contacts2.csv
,contacts4.csv
,contacts5.csv
파일의 데이터가 로드되었습니다.2개의 데이터 오류로 인해
contacts3.csv
의 데이터를 건너뛰었습니다. 이 자습서의 다음 단계에서는 오류를 확인하고 수정하는 방법에 대해 설명합니다.
JSON¶
contacts.json
스테이징된 데이터 파일을 myjsontable
테이블에 로드합니다.
COPY INTO myjsontable FROM @my_json_stage/tutorials/dataloading/contacts.json ON_ERROR = 'skip_file';
COPY는 복사된 파일 이름과 관련 정보를 보여주는 결과를 반환합니다.
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| s3://snowflake-docs/tutorials/dataloading/contacts.json | LOADED | 3 | 3 | 1 | 0 | NULL | NULL | NULL | NULL |
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
정리¶
축하합니다. 이 자습서를 성공적으로 완료하셨습니다.
자습서 정리(선택 사항)¶
자습서를 시작하기 전의 상태로 시스템을 되돌리려면 다음 DROP <오브젝트> 명령을 실행합니다.
DROP DATABASE IF EXISTS mydatabase; DROP WAREHOUSE IF EXISTS mywarehouse;
데이터베이스를 삭제하면 테이블과 같은 모든 하위 데이터베이스 오브젝트가 자동으로 제거됩니다.