데이터 언로드 고려 사항

이 항목에서는 테이블에서의 데이터 언로드와 관련한 모범 사례, 일반 지침 및 중요한 고려 사항을 제공합니다. 이 항목은 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 |
+---+------+--------------+
Copy

예: 따옴표로 묶지 않고 데이터 언로드 및 로드하기

다음 예에서는 데이터 세트가 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

단일 파일로 언로드

기본적으로, 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;
Copy

관계형 테이블을 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"}
Copy

관계형 테이블을 다중 열 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;
Copy

명시적으로 숫자 열을 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);
Copy

부동 소수점 숫자 잘림

부동 소수점 숫자 열이 CSV 또는 JSON 파일로 언로딩될 때, Snowflake는 값을 대략 (15,9)로 자릅니다.

부동 소수점 숫자 열을 Parquet 파일로 언로딩할 때 값이 잘리지 않습니다.