데이터 로드하기

이 항목에서는 스테이징된 데이터를 로드하기 위한 모범 사례, 일반 지침 및 중요한 고려 사항을 제공합니다.

이 항목의 내용:

스테이징된 데이터 파일 선택 옵션

COPY 명령은 스테이지에서 데이터 파일을 로드하기 위한 몇 가지 옵션을 지원합니다.

  • 경로(내부 스테이지)/접두사(Amazon S3 버킷) 사용. 자세한 내용은 경로를 기준으로 데이터 구성하기 을 참조하십시오.

  • 로드할 특정 파일 목록 지정.

  • 패턴 일치를 사용하여 특정 파일을 패턴으로 식별.

이러한 옵션을 사용하면 명령 1개를 사용하여 스테이징된 데이터의 일부를 Snowflake로 복사할 수 있습니다. 이를 통해 병렬 작업을 사용하여 파일의 하위 세트과 일치하는 동시 COPY 문을 실행할 수 있습니다.

파일 목록

COPY INTO <테이블> 명령에는 특정 이름으로 파일을 로드하는 FILES 매개 변수가 포함됩니다.

스테이지에서 로드할 데이터 파일을 식별/지정하는 옵션 3개 중에서 개별 파일 목록을 제공하는 것이 일반적으로 가장 빠르게 실행됩니다. 그러나 FILES 매개 변수는 최대 1,000개의 파일을 지원합니다. 즉, COPY 매개 변수와 함께 실행되는 FILES 명령은 최대 1,000개의 파일만 로드할 수 있습니다.

예:

COPY INTO load1 FROM @%load1/data1/ FILES=('test1.csv', 'test2.csv', 'test3.csv')
Copy

파일 목록과 경로를 함께 사용하면 데이터 로딩을 보다 세밀하게 제어할 수 있습니다.

패턴 일치

COPY INTO <테이블> 명령에는 정규식을 사용하여 파일을 로드하는 PATTERN 매개 변수가 포함됩니다.

예:

COPY INTO people_data FROM @%people_data/data1/
   PATTERN='.*person_data[^0-9{1,3}$$].csv';
Copy

정규식을 사용한 패턴 일치는 일반적으로 스테이지에서 로드할 데이터 파일을 식별/지정하는 옵션 3개 중에서 가장 느리게 실행됩니다. 그러나 이 옵션은 외부 애플리케이션에서 이름이 지정된 순서로 파일을 내보내고 동일한 순서로 파일을 대량 로드하려는 경우에 적합합니다.

패턴 일치와 경로를 함께 사용하면 데이터 로딩을 보다 세밀하게 제어할 수 있습니다.

참고

정규식은 대량 데이터 로딩과 Snowpipe 데이터 로딩에 서로 다르게 적용됩니다.

  • Snowpipe는 저장소 위치에서 스테이지 정의의 경로 세그먼트를 모두 자르고 나머지 경로 세그먼트와 파일 이름에 정규식을 적용합니다. 스테이지 정의를 보려면 스테이지에 대해 DESCRIBE STAGE 명령을 실행하십시오. URL 속성은 버킷 또는 컨테이너 이름과 0개 또는 그 이상의 경로 세그먼트로 구성됩니다. 예를 들어 COPY INTO <테이블> 문에서 FROM 위치가 @s/path1/path2/ 이고 스테이지 @s 의 URL 값이 s3://mybucket/path1/ 인 경우, Snowpipe는 FROM 절의 저장소 위치에서 /path1/ 을 자르고 경로에서 path2/ 와 파일 이름에 정규식을 적용합니다.

  • 대량 데이터 로딩 작업은 정규식을 FROM 절의 전체 저장소 위치에 적용합니다.

비용, 이벤트 노이즈, 대기 시간을 줄이기 위해 Snowpipe에 대해 클라우드 이벤트 필터링을 사용하는 것이 좋습니다. PATTERN 옵션은 클라우드 공급자의 이벤트 필터링 기능이 충분하지 않을 때만 사용하십시오. 각 클라우드 공급자의 이벤트 필터링 구성에 대한 자세한 내용은 다음 페이지를 참조하십시오.

동일한 데이터 파일을 참조하는 병렬 COPY 문 실행

COPY 문이 실행되면 Snowflake는 해당 명령문에서 참조하는 데이터 파일에 대한 테이블 메타데이터의 로드 상태를 설정합니다. 이를 통해 병렬 COPY 문이 동일한 파일을 테이블에 로드하는 것을 방지되어 데이터 중복이 방지됩니다.

COPY 문의 처리되면, Snowflake는 데이터 파일의 로드 상태를 적절하게 조정합니다. 1개 이상의 데이터 파일 로드가 실패하면 Snowflake는 해당 파일의 로드 상태를 로드 실패로 설정합니다. 이 파일은 로드할 후속 COPY 문에 사용할 수 있습니다.

오래된 파일 로드하기

이 섹션에서는 COPY INTO <테이블> 명령이 파일의 로드 상태 파악 여부에 따라 다른 데이터 중복 방지 방법에 대해 설명합니다. 논리적이고 세분화된 날짜별 경로를 사용하여 스테이지에서 데이터를 분할하고(경로를 기준으로 데이터 구성하기 에서 권장됨) 스테이징 후 짧은 시간 내에 데이터를 로드하는 경우 이 섹션은 크게 관련이 없습니다. 그러나 COPY 명령이 데이터 로드에서 이전 파일(즉, 과거 데이터 파일)을 건너뛰는 경우 이 섹션에서는 기본 동작을 우회하는 방법을 설명합니다.

메타데이터 로드

Snowflake는 다음을 포함하여 데이터가 로드되는 각 테이블에 대한 자세한 메타데이터를 유지 관리합니다.

  • 데이터가 로드되는 각 파일의 이름

  • 파일 크기

  • 파일의 ETag

  • 파일에서 구문이 분석되는 행 수

  • 파일의 마지막 로드 타임스탬프

  • 로드하는 동안 파일에서 발생한 오류에 대한 정보

이 로드 메타데이터는 64일 후에 만료됩니다. 스테이징된 데이터 파일의 LAST_MODIFIED 날짜가 64일 미만인 경우 COPY 명령은 주어진 테이블에 대한 로드 상태를 확인하고 재로드(및 데이터 중복)를 방지할 수 있습니다. LAST_MODIFIED 날짜는 파일이 처음 스테이징된 날짜 또는 파일이 마지막으로 수정된 날짜 중 더 늦은 날짜의 타임스탬프입니다.

LAST_MODIFIED 날짜가 64일 이전인 경우 다음 이벤트 중 하나 가 현재 날짜보다 64일 이전에 발생하면 로드 상태를 알 수 있습니다.

  • 파일이 로드되었습니다.

  • 테이블의 초기 데이터 세트(즉, 테이블이 생성된 후 첫 번째 배치)가 로드되었습니다.

그러나 LAST_MODIFIED 날짜가 64일보다 이전이고 초기 데이터 세트가 64일 이전에 테이블에 로드된 경우, COPY 명령은 파일의 로드 여부를 확실히 결정할 수 없습니다.(파일이 이미 로드된 경우 64일 이상 전에 발생한 테이블에 로드됨). 이 경우 실수로 다시 로드하는 것을 방지하기 위해 명령에서 파일을 기본적으로 건너뜁니다.

해결 방법

메타데이터가 만료된 파일을 로드하려면 LOAD_UNCERTAIN_FILES 복사 옵션을 true로 설정합니다. 복사 옵션은 데이터 중복을 피하기 위해 로드 메타데이터(사용 가능한 경우)를 참조하지만, 만료된 로드 메타데이터가 있는 파일의 로드도 시도됩니다.

또는 FORCE 옵션을 설정하여 모든 파일을 로드하고 로드 메타데이터가 있는 경우 이를 무시합니다. 이 옵션은 파일을 다시 로딩하여 테이블의 데이터를 복제할 수 있습니다.

../_images/data-load-status1.png

이 예에서:

  • 1월 1일 에 테이블이 생성되며, 초기 테이블 로드는 같은 날 발생합니다.

  • 64일이 경과합니다. 3월 7일 에 로드 메타데이터가 만료됩니다.

  • 7월 27일28 에 각각 파일이 스테이징되고 테이블에 로드됩니다. 스테이징하고 1일 후에 로드되었으므로 LAST_MODIFIED 날짜는 64일 이내에 해당합니다. 로드 상태가 알려집니다. 파일에 데이터 또는 형식 문제가 없으며 COPY 명령을 통해 로드할 수 있습니다.

  • 64일이 경과합니다. 9월 28일 에는 스테이징된 파일의 LAST_MODIFIED 날짜가 64일을 초과합니다. 9월 29일 에는 파일 로드에 대한 로드 메타데이터가 만료됩니다.

  • 11월 1일 에 동일한 테이블에 파일을 다시 로드하려고 합니다. 파일의 로드 여부를 확인할 수 없으므로 COPY 명령은 파일을 건너뜁니다. 파일을 로드하려면 LOAD_UNCERTAIN_FILES 복사 옵션(또는 FORCE 복사 옵션)이 필요합니다.

../_images/data-load-status2.png

이 예에서:

  • 파일은 1월 1일 에 스테이징됩니다.

  • 64일이 경과합니다. 3월 7일 에는 스테이징된 파일의 LAST_MODIFIED 날짜가 64일을 초과합니다.

  • 9월 29일 에는 새 테이블이 생성되고 스테이징된 파일이 테이블에 로드됩니다. 초기 테이블 로드가 64일 이전에 발생했으므로 COPY 명령은 파일이 이미 로드되지 않았음을 알 수 있습니다. 파일에 데이터 또는 형식 문제가 없으며 COPY 명령을 통해 로드할 수 있습니다.

JSON 데이터: 《null》 값 제거

VARIANT 열에서 NULL 값은 SQL NULL 값이 아닌 《null》이라는 단어가 포함된 문자열로 저장됩니다. JSON 문서에서 《null》 값이 누락된 값으로 표시되고 다른 특별한 의미가 없는 경우, JSON 파일을 로드할 때 COPY INTO <테이블> 명령에 대해 파일 형식 옵션 STRIP_NULL_VALUES를 TRUE로 설정하는 것이 좋습니다. 《null》 값을 유지하면 저장소가 낭비되고 쿼리 처리 속도가 느려지는 경우가 많습니다.

CSV 데이터: 선행 공백 자르기

외부 소프트웨어가 따옴표로 묶인 필드를 내보내지만 각 필드의 여는 따옴표 문자 앞에 선행 공백을 삽입하면 Snowflake는 여는 따옴표 문자가 아닌 선행 공백을 필드의 시작으로 읽습니다. 인용 문자는 문자열 데이터로 해석됩니다.

데이터 로드 중에 불필요한 공백을 제거하려면 TRIM_SPACE 파일 형식 옵션을 사용하십시오.

예를 들어, 예시 CSV 파일의 다음 각 필드에는 선행 공백이 포함되어 있습니다.

"value1", "value2", "value3"
Copy

다음 COPY 명령은 선행 공백을 자르고 각 필드를 묶는 따옴표를 제거합니다.

COPY INTO mytable
FROM @%mytable
FILE_FORMAT = (TYPE = CSV TRIM_SPACE=true FIELD_OPTIONALLY_ENCLOSED_BY = '0x22');

SELECT * FROM mytable;

+--------+--------+--------+
| col1   | col2   | col3   |
+--------+--------+--------+
| value1 | value2 | value3 |
+--------+--------+--------+
Copy