Parquet 데이터 로딩 및 언로딩

이 자습서에서는 COPY INTO <테이블> 명령을 사용하여 스테이징된 Parquet 파일의 요소를 테이블 열로 직접 변환하여 Parquet 데이터를 업로드하는 방법을 설명합니다. 이 자습서에서는 COPY INTO <위치> 명령을 사용하여 테이블 데이터를 Parquet 파일로 언로드하는 방법도 설명합니다.

이 항목의 내용:

전제 조건

이 자습서에서는 다음을 수행해야 합니다.

  • Snowflake에서 제공하는 Parquet 데이터 파일을 다운로드합니다.

  • 데이터베이스, 테이블, 가상 웨어하우스를 만듭니다.

데이터베이스, 테이블, 가상 웨어하우스는 대부분의 Snowflake 활동에 필요한 기본 Snowflake 오브젝트입니다.

샘플 데이터 파일 다운로드하기

샘플 Parquet 데이터 파일을 다운로드하려면 cities.parquet 을 클릭하십시오. 또는 마우스 오른쪽 버튼을 클릭하고 링크를 마우스 오른쪽 버튼으로 클릭하고 링크/파일을 로컬 파일 시스템에 저장합니다.

이 자습서에서는 다음 디렉터리에 파일의 압축을 푼 것으로 가정합니다.

  • Linux/macOS: /tmp/load

  • Windows: C:\\temp\load

Parquet 데이터 파일에는 샘플 대륙 데이터가 포함되어 있습니다. 다음은 대표적인 예입니다.

{
  "continent": "Europe",
  "country": {
    "city": [
      "Paris",
      "Nice",
      "Marseilles",
      "Cannes"
    ],
    "name": "France"
  }
}
Copy

데이터베이스, 테이블, 가상 웨어하우스 만들기

다음 명령은 이 자습서에서 특별히 사용하기 위한 오브젝트를 생성합니다. 자습서를 완료하면 이러한 오브젝트를 삭제할 수 있습니다.

 create or replace database mydatabase;

 use schema mydatabase.public;

  create or replace temporary table cities (
    continent varchar default null,
    country varchar default null,
    city variant default null
  );

create or replace warehouse mywarehouse with
  warehouse_size='X-SMALL'
  auto_suspend = 120
  auto_resume = true
  initially_suspended=true;

use warehouse mywarehouse;
Copy

이러한 명령으로 임시 테이블을 생성합니다. 임시 테이블은 사용자 세션 기간에만 지속되며 다른 사용자에게는 표시되지 않습니다.

1단계: 파일 형식 오브젝트 생성

CREATE FILE FORMAT 명령을 실행하여 sf_tut_parquet_format 파일 형식을 만듭니다.

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format
  TYPE = parquet;
Copy

TYPE = 'parquet' 은 원본 파일 형식 유형을 나타냅니다. CSV는 기본 파일 형식 유형입니다.

2단계: 스테이지 오브젝트 생성

CREATE STAGE 명령을 실행하여 내부 sf_tut_stage 스테이지를 만듭니다.

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage
FILE_FORMAT = sf_tut_parquet_format;
Copy

임시 테이블과 마찬가지로, 임시 스테이지는 세션이 끝나면 자동으로 삭제됩니다.

3단계: 데이터 파일 스테이징

PUT 명령을 실행하여 로컬 파일 시스템에서 명명된 스테이지로 Parquet 파일을 업로드합니다.

  • Linux 또는 macOS

    PUT file:///tmp/load/cities.parquet @sf_tut_stage;
    
    Copy
  • Windows

    PUT file://C:\temp\load\cities.parquet @sf_tut_stage;
    
    Copy

4단계: 데이터를 대상 테이블로 복사

cities.parquet 스테이징된 데이터 파일을 CITIES 테이블에 복사합니다.

copy into cities
 from (select $1:continent::varchar,
              $1:country:name::varchar,
              $1:country:city::variant
      from @sf_tut_stage/cities.parquet);
Copy

다음 사항을 참고하십시오.

  • SELECT 쿼리의 $1 은 Parquet 데이터가 저장된 단일 열을 나타냅니다.

  • 이 쿼리는 검색하는 각 Parquet 요소 값을 특정한 열 유형으로 캐스팅합니다.

다음 쿼리를 실행하여 데이터가 복사되는지 확인합니다.

SELECT * from cities;
Copy

쿼리에서 반환되는 결과는 다음과 같습니다.

+---------------+---------+-----------------+
| CONTINENT     | COUNTRY | CITY            |
|---------------+---------+-----------------|
| Europe        | France  | [               |
|               |         |   "Paris",      |
|               |         |   "Nice",       |
|               |         |   "Marseilles", |
|               |         |   "Cannes"      |
|               |         | ]               |
|---------------+---------+-----------------|
| Europe        | Greece  | [               |
|               |         |   "Athens",     |
|               |         |   "Piraeus",    |
|               |         |   "Hania",      |
|               |         |   "Heraklion",  |
|               |         |   "Rethymnon",  |
|               |         |   "Fira"        |
|               |         | ]               |
|---------------+---------+-----------------|
| North America | Canada  | [               |
|               |         |   "Toronto",    |
|               |         |   "Vancouver",  |
|               |         |   "St. John's", |
|               |         |   "Saint John", |
|               |         |   "Montreal",   |
|               |         |   "Halifax",    |
|               |         |   "Winnipeg",   |
|               |         |   "Calgary",    |
|               |         |   "Saskatoon",  |
|               |         |   "Ottawa",     |
|               |         |   "Yellowknife" |
|               |         | ]               |
+---------------+---------+-----------------+
Copy

5단계: 테이블 언로드

CITIES 테이블을 다른 Parquet 파일로 언로드합니다.

참고

기본적으로 Snowflake는 모든 값을 허용하는 가장 작은 전체 자릿수를 설정하여 언로드된 Parquet 데이터 파일의 테이블 열을 최적화합니다. 《논리적》 열 데이터 타입(즉, 언로드 SQL 쿼리 또는 소스 테이블의 타입)에 의해 결정되는 일정한 출력 파일 스키마를 원하는 경우에는 ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION 세션 매개 변수를 FALSE로 설정하십시오.

copy into @sf_tut_stage/out/parquet_
from (select continent,
             country,
             c.value::string as city
     from cities,
          lateral flatten(input => city) c)
  file_format = (type = 'parquet')
  header = true;
Copy

다음 사항을 참고하십시오.

  • file_format = (type = 'parquet') 는 스테이지에 있는 데이터 파일의 형식으로 parquet를 지정합니다. Parquet 파일 형식을 지정한 경우 COPY INTO <location> 명령은 기본적으로 단일 열로 데이터를 언로딩합니다.

  • header=true 옵션을 지정하면 이 명령을 실행할 때 출력 파일에 열 이름이 유지됩니다.

  • 중첩된 SELECT 쿼리에서:

    • FLATTEN 함수는 먼저 city 열 배열 요소를 별도의 열로 평면화합니다.

    • LATERAL 한정자는 FLATTEN 함수의 출력을 오브젝트 외부 정보(이 예에서는 continentcountry)와 조인합니다.

다음 쿼리를 실행하여 데이터가 스테이징된 Parquet 파일로 복사되는지 확인합니다.

select t.$1 from @sf_tut_stage/out/ t;
Copy

쿼리는 다음 결과를 반환합니다(결과는 일부만 표시됨).

+---------------------------------+
| $1                              |
|---------------------------------|
| {                               |
|   "CITY": "Paris",              |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
|---------------------------------|
| {                               |
|   "CITY": "Nice",               |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
|---------------------------------|
| {                               |
|   "CITY": "Marseilles",         |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
+---------------------------------+
Copy

6단계: 성공적으로 복사한 데이터 파일 제거

스테이지에서 테이블로 데이터를 올바로 복사했는지 확인한 후 REMOVE 명령을 사용하여 내부 스테이지에서 데이터 파일을 제거하여 데이터 저장소 에 저장할 수 있습니다.

REMOVE @sf_tut_stage/cities.parquet;
Copy

7단계: 정리

자습서를 시작하기 전의 상태로 시스템을 되돌리려면 다음 DROP <오브젝트> 명령을 실행합니다.

DROP DATABASE IF EXISTS mydatabase;
DROP WAREHOUSE IF EXISTS mywarehouse;
Copy

데이터베이스를 삭제하면 테이블과 같은 모든 하위 데이터베이스 오브젝트가 자동으로 제거됩니다.