데이터 언로드 고려 사항¶
이 항목에서는 테이블에서의 데이터 언로드와 관련한 모범 사례, 일반 지침 및 중요한 고려 사항을 제공합니다. 이 항목은 COPY INTO <위치> 명령을 사용하여 Snowflake 테이블에서 스테이지의 파일로 데이터를 편리하게 내보낼 수 있도록 제공됩니다.
이 항목의 내용:
빈 문자열 및 NULL 값¶
빈 문자열이란 길이가 0이거나 문자가 없는 문자열이지만, NULL 값은 데이터가 없음을 나타냅니다. CSV 파일에서 NULL 값은 일반적으로 필드가 데이터가 없음을 나타내는 두 개의 연속 구분 기호(예: ,,
)로 표시되지만, 문자열 값을 사용하여 NULL(예: null
) 또는 고유 문자열을 나타낼 수 있습니다. 빈 문자열은 일반적으로 따옴표가 붙은 빈 문자열(예: ''
)로 표시되어 문자열에 문자가 없음을 나타냅니다.
다음 파일 형식 옵션을 사용하면 데이터를 언로드 또는 로드할 때 빈 문자열과 NULL 값을 구분할 수 있습니다. 이러한 파일 형식에 대한 자세한 내용은 CREATE FILE FORMAT 을 참조하십시오.
FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE
작은따옴표(
'
), 큰따옴표("
) 또는 NONE의 지정된 문자로 문자열을 묶으려면 이 옵션을 사용합니다.데이터를 언로드할 때 따옴표로 문자열 값을 묶을 필요가 없습니다. COPY INTO 위치 명령은 EMPTY_FIELD_AS_NULL 옵션을 FALSE로 설정하여 따옴표로 묶지 않고 빈 문자열 값을 언로드할 수 있습니다. EMPTY_FIELD_AS_NULL 옵션이 TRUE(즉, 금지됨)이면 빈 문자열 및 NULL 값을 출력 파일에서 구분할 수 없습니다.
필드에 이 문자가 포함된 경우 같은 문자를 사용하여 이스케이프합니다. 예를 들어, 값이 큰따옴표 문자이고 필드에 문자열
"A"
가 포함된 경우""A""
와 같이 큰따옴표를 이스케이프합니다.기본값:
NONE
EMPTY_FIELD_AS_NULL = TRUE | FALSE
테이블에서 빈 문자열 데이터를 언로드할 때 다음 옵션 중 하나를 선택합니다.
기본:
FIELD_OPTIONALLY_ENCLOSED_BY
옵션을 설정하여 문자열을 따옴표로 묶어 출력 CSV 파일에서 빈 문자열과 NULLs을 구분합니다.빈 문자열을 빈 필드로 언로드하려면
FIELD_OPTIONALLY_ENCLOSED_BY
옵션을NONE
(기본값)으로 설정하여 문자열 필드를 묶지 않은 상태로 유지하고EMPTY_FIELD_AS_NULL
값을FALSE
로 설정합니다.중요
이 옵션을 선택하는 경우에는
NULL_IF
옵션을 사용하여 NULL 데이터에 대한 대체 문자열을 지정해 출력 파일에서 NULL 값과 빈 문자열을 구분합니다. 나중에 출력 파일에서 데이터를 로드하려면 동일한NULL_IF
값을 지정하여 데이터 파일에 NULL 값을 지정하면 됩니다.
데이터를 테이블로 로드할 때 이 옵션을 사용하여 입력 파일의 빈 필드에 SQL NULL을 삽입할지 여부를 지정합니다. FALSE로 설정하면 Snowflake가 빈 필드를 해당 열 타입으로 캐스팅하려고 시도합니다. 데이터 타입이 STRING인 열에 빈 문자열이 삽입됩니다. 다른 열 타입의 경우 COPY 명령에서 오류가 발생합니다.
기본값:
TRUE
NULL_IF = ( 'string1' [ , 'string2' ... ] )
테이블에서 데이터를 언로드할 때, Snowflake는 SQL NULL 값을 목록의 첫 번째 값으로 변환합니다. NULL로 해석할 값을 지정할 때 유의하십시오. 예를 들어, 다른 시스템에서 읽을 파일로 데이터를 언로드하려면 해당 시스템에서 NULL로 해석할 값을 지정해야 합니다.
기본값:
\\N
(즉,ESCAPE_UNENCLOSED_FIELD
값이\\
(기본값)인 것으로 가정하는 NULL)
예: 따옴표로 묶은 데이터 언로드 및 로드하기¶
다음 예에서는 데이터 세트가 null_empty1
테이블에서 사용자 스테이지로 언로드됩니다. 이후에는 출력 데이터 파일을 사용하여 데이터를 null_empty2
테이블로 로드합니다.
-- Source table (null_empty1) contents
+---+------+--------------+
| i | V | D |
|---+------+--------------|
| 1 | NULL | NULL value |
| 2 | | Empty string |
+---+------+--------------+
-- Create a file format that describes the data and the guidelines for processing it
create or replace file format my_csv_format
field_optionally_enclosed_by='0x27' null_if=('null');
-- Unload table data into a stage
copy into @mystage
from null_empty1
file_format = (format_name = 'my_csv_format');
-- Output the data file contents
1,'null','NULL value'
2,'','Empty string'
-- Load data from the staged file into the target table (null_empty2)
copy into null_empty2
from @mystage/data_0_0_0.csv.gz
file_format = (format_name = 'my_csv_format');
select * from null_empty2;
+---+------+--------------+
| i | V | D |
|---+------+--------------|
| 1 | NULL | NULL value |
| 2 | | Empty string |
+---+------+--------------+
예: 따옴표로 묶지 않고 데이터 언로드 및 로드하기¶
다음 예에서는 데이터 세트가 null_empty1
테이블에서 사용자 스테이지로 언로드됩니다. 이후에는 출력 데이터 파일을 사용하여 데이터를 null_empty2
테이블로 로드합니다.
-- Source table (null_empty1) contents
+---+------+--------------+
| i | V | D |
|---+------+--------------|
| 1 | NULL | NULL value |
| 2 | | Empty string |
+---+------+--------------+
-- Create a file format that describes the data and the guidelines for processing it
create or replace file format my_csv_format
empty_field_as_null=false null_if=('null');
-- Unload table data into a stage
copy into @mystage
from null_empty1
file_format = (format_name = 'my_csv_format');
-- Output the data file contents
1,null,NULL value
2,,Empty string
-- Load data from the staged file into the target table (null_empty2)
copy into null_empty2
from @mystage/data_0_0_0.csv.gz
file_format = (format_name = 'my_csv_format');
select * from null_empty2;
+---+------+--------------+
| i | V | D |
|---+------+--------------|
| 1 | NULL | NULL value |
| 2 | | Empty string |
+---+------+--------------+
단일 파일로 언로드¶
기본적으로, COPY INTO 위치 문은 병렬 연산을 사용하기 위해 테이블 데이터와 출력 파일 세트를 구분합니다. 각 파일의 최소 크기는 MAX_FILE_SIZE
복사 옵션을 사용하여 설정할 수 있습니다. 기본값은 16777216
(16 MB)이지만 더 큰 파일을 사용할 수 있도록 증가시킬 수 있습니다. Amazon S3, Google Cloud Storage 또는 Microsoft Azure 스테이지에서 지원되는 최대 파일 크기는 5 GB입니다.
데이터를 단일 출력 파일(성능이 저하될 수 있음)로 언로드하려면 명령에 SINGLE = true
복사 옵션을 지정합니다. 선택 사항으로 경로에 파일 이름을 지정할 수 있습니다.
참고
COMPRESSION
옵션이 true로 설정된 경우, 압축 방법에 해당하는 파일 확장자와 함께 파일 이름을 지정하여 출력 파일의 압축을 해제할 수 있도록 합니다. 예를 들어, GZ 압축 방법을 사용하는 경우 GZIP
파일 확장자를 지정합니다.
예를 들어, mytable
테이블 데이터를 명명된 스테이지의 단일 파일인 myfile.csv
로 언로드합니다. 더 큰 데이터 파일을 사용할 수 있도록 MAX_FILE_SIZE
한도를 늘립니다.
copy into @mystage/myfile.csv.gz from mytable
file_format = (type=csv compression='gzip')
single=true
max_file_size=4900000000;
관계형 테이블을 JSON으로 언로드하기¶
OBJECT_CONSTRUCT 함수와 함께 COPY 명령을 사용하여 관계형 테이블의 행을 단일 VARIANT 열로 변환하고 행을 파일로 언로드할 수 있습니다.
예:
-- Create a table
CREATE OR REPLACE TABLE mytable (
id number(8) NOT NULL,
first_name varchar(255) default NULL,
last_name varchar(255) default NULL,
city varchar(255),
state varchar(255)
);
-- Populate the table with data
INSERT INTO mytable (id,first_name,last_name,city,state)
VALUES
(1,'Ryan','Dalton','Salt Lake City','UT'),
(2,'Upton','Conway','Birmingham','AL'),
(3,'Kibo','Horton','Columbus','GA');
-- Unload the data to a file in a stage
COPY INTO @mystage
FROM (SELECT OBJECT_CONSTRUCT('id', id, 'first_name', first_name, 'last_name', last_name, 'city', city, 'state', state) FROM mytable)
FILE_FORMAT = (TYPE = JSON);
-- The COPY INTO location statement creates a file named data_0_0_0.json.gz in the stage.
-- The file contains the following data:
{"city":"Salt Lake City","first_name":"Ryan","id":1,"last_name":"Dalton","state":"UT"}
{"city":"Birmingham","first_name":"Upton","id":2,"last_name":"Conway","state":"AL"}
{"city":"Columbus","first_name":"Kibo","id":3,"last_name":"Horton","state":"GA"}
관계형 테이블을 다중 열 Parquet으로 언로드하기¶
SELECT 문을 COPY 문의 입력으로 사용하여 관계형 테이블의 데이터를 다중 열 Parquet 파일로 언로드할 수 있습니다. SELECT 문은 언로드된 파일을 포함하도록 관계형 테이블의 열 데이터를 지정합니다. HEADER = TRUE
복사 옵션을 사용하여 출력 파일의 열 헤더를 포함합니다.
예를 들어, start_date
테이블의 열 3개(id
, name
, mytable
)에서 명명 형식이 myfile.parquet
인 1개 이상의 파일로 행을 언로드합니다.
COPY INTO @mystage/myfile.parquet FROM (SELECT id, name, start_date FROM mytable)
FILE_FORMAT=(TYPE='parquet')
HEADER = TRUE;
명시적으로 숫자 열을 Parquet 데이터 타입으로 변환¶
기본적으로, 테이블 데이터가 Parquet 파일로 언로딩될 때 고정 소수점 숫자 열은 DECIMAL 열로 언로딩되는 한편, 부동 소수점 숫자 열은 DOUBLE 열로 언로딩됩니다.
언로딩된 데이터 세트에 대한 Parquet 데이터 타입을 선택하려면 COPY INTO <위치> 문의 CAST , :: 함수를 호출하여 특정 테이블 열을 명시적 데이터 타입으로 변환하십시오. COPY INTO <위치> 문의 쿼리는 언로딩할 특정 열의 선택을 지원하고 열 데이터를 변환하는 변환 SQL 함수를 허용합니다.
COPY INTO <location> 절의 쿼리는 SELECT 절의 구문 및 의미 체계를 지원하여 언로드할 특정 Snowflake 테이블 열을 쿼리합니다. CAST , :: 함수를 사용하여 숫자 열의 데이터를 특정 데이터 타입으로 변환합니다.
다음 테이블에서는 Snowflake 숫자 데이터 타입을 Parquet 물리 및 논리 데이터 타입으로 매핑합니다.
Snowflake 논리 데이터 타입 |
Parquet 물리 데이터 타입 |
Parquet 논리 데이터 타입 |
---|---|---|
TINYINT |
INT32 |
INT(8) |
SMALLINT |
INT32 |
INT(16) |
INT |
INT32 |
INT(32) |
BIGINT |
INT64 |
INT(64) |
FLOAT |
FLOAT |
N/A |
DOUBLE |
DOUBLE |
N/A |
다음 예에서는 언로드된 각 열의 숫자 데이터를 다른 데이터 타입으로 변환하여 Parquet 파일에서 데이터 타입을 명시적으로 선택할 수 있는 COPY INTO <location> 절을 보여줍니다.
COPY INTO @mystage
FROM (SELECT CAST(C1 AS TINYINT) ,
CAST(C2 AS SMALLINT) ,
CAST(C3 AS INT),
CAST(C4 AS BIGINT) FROM mytable)
FILE_FORMAT=(TYPE=PARQUET);
부동 소수점 숫자 잘림¶
부동 소수점 숫자 열이 CSV 또는 JSON 파일로 언로딩될 때, Snowflake는 값을 대략 (15,9)로 자릅니다.
부동 소수점 숫자 열을 Parquet 파일로 언로딩할 때 값이 잘리지 않습니다.