튜토리얼: Amazon S3에서 데이터 로드
이 튜토리얼에서는 Amazon S3 버킷에 있는 데이터 파일에서 Amazon Redshift 데이터베이스 테이블로 데이터를 로드하는 프로세스를 처음부터 끝까지 살펴봅니다.
이 자습서에서는 다음 작업을 수행합니다.
-
쉼표로 구분된 값(CSV) 형식, 문자로 구분된 형식, 고정 너비 형식을 사용하는 데이터 파일을 다운로드합니다.
-
Amazon S3 버킷을 생성한 다음 이 버킷에 데이터 파일을 업로드합니다.
-
Amazon Redshift 클러스터를 시작하고 데이터베이스 테이블을 생성합니다.
-
COPY 명령을 사용하여 Amazon S3의 데이터 파일에서 테이블을 로드합니다.
-
로드 오류 문제를 해결하고 COPY 명령을 수정하여 오류를 수정합니다.
예상 소요 시간: 60분
예상 비용: 클러스터 시간당 $1.00
사전 조건
필요한 사전 조건은 다음과 같습니다.
-
Amazon Redshift 클러스터를 시작하고 Amazon S3에 버킷을 생성하기 위한 AWS 계정.
-
Amazon S3에서 테스트 데이터를 로드하기 위한 AWS 자격 증명(IAM 역할). 새로운 IAM 역할이 필요한 경우 IAM 역할 생성으로 이동합니다.
-
Amazon Redshift 콘솔 쿼리 편집기와 같은 SQL 클라이언트.
이 자습서는 자습서만으로 학습이 가능하도록 만들어졌습니다. Amazon Redshift 데이터베이스의 설계 및 사용 방법을 더 깊이 이해하려면 이 튜토리얼 외에 다음 튜토리얼을 공부하는 것이 좋습니다.
-
Amazon Redshift 시작 안내서에서는 Amazon Redshift 클러스터를 생성하고 샘플 데이터를 로드하는 프로세스를 안내합니다.
개요
INSERT 명령 또는 COPY 명령을 사용하여 Amazon Redshift 테이블에 데이터를 추가할 수 있습니다. Amazon Redshift 데이터 웨어하우스의 규모와 속도에서는 COPY 명령이 INSERT 명령보다 몇 배 더 빠르고 효율적입니다.
COPY 명령은 Amazon Redshift 대량 병렬 처리(MPP) 아키텍처를 사용하여 여러 데이터 원본에서 병렬로 데이터를 읽고 로드합니다. Amazon S3, Amazon EMR 또는 SSH(Secure Shell) 연결을 통해 액세스 가능한 원격 호스트에 있는 데이터 파일에서 로드할 수 있습니다. 또는 Amazon DynamoDB 테이블에서 직접 로드할 수 있습니다.
이 튜토리얼에서는 COPY 명령을 사용하여 Amazon S3에서 데이터를 로드합니다. 여기 설명된 여러 원리는 다른 데이터 원본에서의 로드에도 적용됩니다.
COPY 명령을 사용하는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하십시오.
1단계: 클러스터 생성
사용할 클러스터가 이미 있다면 이 단계를 건너뛰어도 됩니다.
이 자습서에서는 연습용으로 4노드 클러스터를 사용합니다.
클러스터 생성
-
AWS Management Console에 로그인한 후 https://console.aws.amazon.com/redshiftv2/
에서 Amazon Redshift 콘솔을 엽니다. 탐색 메뉴에서 프로비저닝된 클러스터 대시보드를 선택합니다.
중요
사용자에게 클러스터 작업을 수행하는 데 필요한 권한이 있는지 확인해야 합니다. 필요한 권한을 부여하는 방법에 대한 자세한 내용은 Amazon Redshift의 AWS 서비스 액세스 권한 부여를 참조하십시오.
-
오른쪽 상단에서 클러스터를 생성하려는 AWS 리전을 선택합니다. 본 튜토리얼의 목적에 맞게 [미국 서부(오레곤)(US West (Oregon))]를 선택합니다.
-
탐색 메뉴에서 클러스터(Clusters)를 선택한 다음 클러스터 생성(Create cluster)을 선택합니다. 클러스터 생성 페이지가 표시됩니다.
-
클러스터 생성(Create cluster) 페이지에서 클러스터의 파라미터를 입력합니다. 다음 값을 변경하는 것을 제외하고 파라미터에 대해 고유한 값을 선택합니다.
노드 유형으로
dc2.large
를 선택합니다.노드 수(Number of nodes)로
4
를 선택합니다.Cluster permissions(클러스터 권한) 섹션의 Available IAM roles(사용 가능한 IAM 역할)에서 IAM 역할을 선택합니다. 이 역할은 이전에 생성하고 Amazon S3에 액세스할 수 있는 역할이어야 합니다. 그런 다음 IAM 역할 연결(Associate IAM role)을 선택하여 클러스터에 대한 연결된 IAM 역할(Associated IAM roles) 목록에 추가합니다.
-
클러스터 생성을 선택합니다.
Amazon Redshift 시작 안내서 단계에 따라 SQL 클라이언트에서 클러스터에 연결한 후 연결을 테스트합니다. 그 밖에 테이블을 생성하거나 데이터를 업로드하거나 예제 쿼리를 실행하는 나머지 시작하기 단계는 완료할 필요가 없습니다.
2단계: 데이터 파일 다운로드
이 단계에서는 샘플 데이터 파일 세트를 컴퓨터에 다운로드합니다. 다음 단계에서는 파일을 Amazon S3 버킷에 업로드합니다.
데이터 파일을 다운로드하려면
-
압축된 파일 LoadingDataSampleFiles.zip을 다운로드합니다.
-
파일을 컴퓨터의 폴더에 압축 해제합니다.
-
폴더에 다음 파일이 포함되어 있는지 확인합니다.
customer-fw-manifest customer-fw.tbl-000 customer-fw.tbl-000.bak customer-fw.tbl-001 customer-fw.tbl-002 customer-fw.tbl-003 customer-fw.tbl-004 customer-fw.tbl-005 customer-fw.tbl-006 customer-fw.tbl-007 customer-fw.tbl.log dwdate-tab.tbl-000 dwdate-tab.tbl-001 dwdate-tab.tbl-002 dwdate-tab.tbl-003 dwdate-tab.tbl-004 dwdate-tab.tbl-005 dwdate-tab.tbl-006 dwdate-tab.tbl-007 part-csv.tbl-000 part-csv.tbl-001 part-csv.tbl-002 part-csv.tbl-003 part-csv.tbl-004 part-csv.tbl-005 part-csv.tbl-006 part-csv.tbl-007
3단계: Amazon S3 버킷에 파일 업로드
이 단계에서는 Amazon S3 버킷을 생성하고 이 버킷에 데이터 파일을 업로드합니다.
Amazon S3 버킷에 파일을 업로드하려면
-
Amazon S3에서 버킷을 생성합니다.
버킷 생성에 대한 자세한 내용을 알아보려면 Amazon Simple Storage Service 사용 설명서의 버킷 생성을 참조하세요.
-
AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/
에서 Amazon S3 콘솔을 엽니다. -
버킷 생성을 선택합니다.
-
AWS 리전을 선택합니다.
클러스터와 같은 리전에 버킷을 생성합니다. 클러스터가 미국 서부(오레곤) 리전에 있는 경우 미국 서부(오레곤) 리전(us-west-2)(US West (Oregon) Region (us-west-2))을 선택합니다.
-
버킷 생성 대화 상자의 버킷 이름 상자에 버킷 이름을 입력합니다.
선택한 버킷 이름은 Amazon S3의 모든 기존 버킷 이름을 통틀어 고유해야 합니다. 고유성을 보장하기 위한 한 가지 방법은 버킷 이름의 접두사로 조직 이름을 사용하는 것입니다. 버킷 이름은 특정 규칙을 준수해야 합니다. 자세한 내용은 Amazon Simple Storage Service 사용 설명서의 버킷 규제 및 제한을 참조하세요.
-
나머지 옵션의 경우 권장 기본값을 선택합니다.
-
버킷 생성을 선택합니다.
Amazon S3에서 버킷을 생성하면 콘솔의 [버킷(Buckets)] 패널에 빈 버킷이 표시됩니다.
-
-
폴더를 만듭니다.
-
새 버킷의 이름을 선택합니다.
-
폴더 생성 버튼을 선택합니다.
-
새 폴더의 이름을
load
로 지정합니다.참고
만든 버킷이 샌드박스에 없습니다. 이 연습에서는 실제 버킷에 객체를 추가합니다. 버킷에 객체를 저장한 시간에 대해 명목 금액이 청구됩니다. Amazon S3 요금에 대한 자세한 내용은 Amazon S3 요금
섹션을 참조하세요.
-
-
새 Amazon S3 버킷에 데이터 파일을 업로드합니다.
-
데이터 폴더의 이름을 선택합니다.
-
업로드 마법사에서 파일 추가를 선택합니다.
Amazon S3 콘솔 지침에 따라 다운로드하고 추출한 모든 파일을 업로드합니다.
-
업로드를 선택합니다.
-
사용자 자격 증명
Amazon Redshift COPY 명령에 Amazon S3 버킷의 파일 객체를 읽을 수 있는 액세스 권한이 있어야 합니다. Amazon S3 버킷 생성에 사용한 사용자 자격 증명이 Amazon Redshift COPY 명령 실행에 사용하는 자격 증명과 같다면 COPY 명령은 필요한 모든 권한을 가지게 됩니다. 다른 사용자 자격 증명을 사용하려는 경우 Amazon S3 액세스 제어를 사용하여 액세스 권한을 부여하면 됩니다. Amazon Redshift COPY 명령이 Amazon S3 버킷의 파일 객체에 액세스하기 위해서는 적어도 ListBucket 및 GetObject 권한이 필요합니다. Amazon S3 리소스 액세스에 대한 자세한 내용은 Amazon S3 리소스에 대한 액세스 권한 관리 섹션을 참조하세요.
4단계: 샘플 테이블 생성
이 자습서에서는 SSB(Star Schema Benchmark) 스키마 기반 테이블 5개를 한 세트로 사용합니다. 다음 다이어그램은 SSB 데이터 모델을 나타냅니다.
SSB 테이블이 현재 데이터베이스에 이미 존재할 수 있습니다. 이 경우 데이터베이스에서 이 테이블을 삭제한 후 다음 단계에서 CREATE TABLE 명령을 사용해 테이블을 만들어야 합니다. 이 자습서에서 사용하는 테이블은 기존 테이블과 속성이 다를 수 있습니다.
샘플 테이블을 만들려면
-
SSB 테이블을 삭제하려면 SQL 클라이언트에서 다음 명령을 실행합니다.
drop table part cascade; drop table supplier; drop table customer; drop table dwdate; drop table lineorder;
-
SQL 클라이언트에서 다음 CREATE TABLE 명령을 실행합니다.
CREATE TABLE part ( p_partkey INTEGER NOT NULL, p_name VARCHAR(22) NOT NULL, p_mfgr VARCHAR(6), p_category VARCHAR(7) NOT NULL, p_brand1 VARCHAR(9) NOT NULL, p_color VARCHAR(11) NOT NULL, p_type VARCHAR(25) NOT NULL, p_size INTEGER NOT NULL, p_container VARCHAR(10) NOT NULL ); CREATE TABLE supplier ( s_suppkey INTEGER NOT NULL, s_name VARCHAR(25) NOT NULL, s_address VARCHAR(25) NOT NULL, s_city VARCHAR(10) NOT NULL, s_nation VARCHAR(15) NOT NULL, s_region VARCHAR(12) NOT NULL, s_phone VARCHAR(15) NOT NULL ); CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ); CREATE TABLE dwdate ( d_datekey INTEGER NOT NULL, d_date VARCHAR(19) NOT NULL, d_dayofweek VARCHAR(10) NOT NULL, d_month VARCHAR(10) NOT NULL, d_year INTEGER NOT NULL, d_yearmonthnum INTEGER NOT NULL, d_yearmonth VARCHAR(8) NOT NULL, d_daynuminweek INTEGER NOT NULL, d_daynuminmonth INTEGER NOT NULL, d_daynuminyear INTEGER NOT NULL, d_monthnuminyear INTEGER NOT NULL, d_weeknuminyear INTEGER NOT NULL, d_sellingseason VARCHAR(13) NOT NULL, d_lastdayinweekfl VARCHAR(1) NOT NULL, d_lastdayinmonthfl VARCHAR(1) NOT NULL, d_holidayfl VARCHAR(1) NOT NULL, d_weekdayfl VARCHAR(1) NOT NULL ); CREATE TABLE lineorder ( lo_orderkey INTEGER NOT NULL, lo_linenumber INTEGER NOT NULL, lo_custkey INTEGER NOT NULL, lo_partkey INTEGER NOT NULL, lo_suppkey INTEGER NOT NULL, lo_orderdate INTEGER NOT NULL, lo_orderpriority VARCHAR(15) NOT NULL, lo_shippriority VARCHAR(1) NOT NULL, lo_quantity INTEGER NOT NULL, lo_extendedprice INTEGER NOT NULL, lo_ordertotalprice INTEGER NOT NULL, lo_discount INTEGER NOT NULL, lo_revenue INTEGER NOT NULL, lo_supplycost INTEGER NOT NULL, lo_tax INTEGER NOT NULL, lo_commitdate INTEGER NOT NULL, lo_shipmode VARCHAR(10) NOT NULL );
5단계: COPY 명령 실행
COPY 명령을 실행하여 SSB 스키마에서 각각의 테이블을 로드합니다. COPY 명령 예에서는 다양한 파일 형식에서 로드하는 방법, 몇 가지 COPY 명령 옵션을 사용하는 방법, 로드 오류 문제를 해결하는 방법을 보여 줍니다.
COPY 명령 구문
기본적인 COPY 명령 구문은 다음과 같습니다.
COPY table_name [ column_list ] FROM data_source CREDENTIALS access_credentials [options]
COPY 명령을 실행하기 위해서는 다음 값을 제공해야 합니다.
테이블 이름
COPY 명령의 대상 테이블. 이 테이블은 사전에 데이터베이스에 존재해야 하며, 임시 테이블일 수도 있고, 영구 테이블일 수도 있습니다. COPY 명령은 새로운 입력 데이터를 테이블의 기존 행에 추가합니다.
열 목록
기본적으로 COPY는 원본 데이터에서 테이블 열로 필드를 순서대로 로드합니다. 필요할 경우, 열 이름이 쉼표로 분리된 열 목록을 지정하여 데이터 필드를 특정 열에 매핑할 수 있습니다. 이 자습서에서는 열 목록을 사용하지 않습니다. 자세한 내용은 COPY 명령 참조의 Column List 섹션을 참조하세요.
데이터 원본
COPY 명령을 사용하여 Amazon S3 버킷, Amazon EMR 클러스터, SSH 연결을 사용하는 원격 호스트 또는 Amazon DynamoDB 테이블에서 데이터를 로드할 수 있습니다. 이 튜토리얼에서는 Amazon S3 버킷의 데이터 파일에서 데이터를 로드합니다. Amazon S3에서 로드할 때 버킷 이름과 데이터 파일 위치를 제공해야 합니다. 이렇게 하려면 데이터 파일의 객체 경로 또는 각 데이터 파일과 해당 위치를 명시적으로 나열하는 매니페스트 파일의 위치를 제공합니다.
-
키 접두사
Amazon S3에 저장된 객체는 버킷 이름, 폴더 이름(있는 경우), 객체 이름이 포함된 객체 키에 의해 고유하게 식별됩니다. 키 접두사는 접두사가 동일한 객체 집합을 말합니다. 객체 경로는 키 접두사로서 해당 키 접두사를 공유하는 모든 객체를 로드할 때 COPY 명령이 사용합니다. 예를 들어 키 접두사
custdata.txt
는 단일 파일 또는custdata.txt.001
,custdata.txt.002
등등의 파일 집합을 가리킬 수 있습니다. -
매니페스트 파일
경우에 따라 여러 버킷 또는 폴더와 같이 접두사가 다른 파일을 로드해야 할 수도 있습니다. 또는 접두사를 공유하는 파일을 제외해야 할 수도 있습니다. 이 경우 매니페스트 파일을 사용할 수 있습니다. 매니페스트 파일은 각각의 로드 파일과 그 고유한 객체 키를 명시적으로 나열합니다. 이 자습서 뒷부분에서는 매니페스트 파일을 사용하여 PART 테이블을 로드합니다.
보안 인증 정보
로드할 데이터가 포함된 AWS 리소스에 액세스하려면 충분한 권한이 있는 사용자의 AWS 액세스 보안 인증 정보를 제공해야 합니다. 이러한 자격 증명에는 IAM 역할 Amazon 리소스 이름(ARN)이 포함됩니다. Amazon S3에서 데이터를 로드하려면 자격 증명에 ListBucket 및 GetObject 권한이 있어야 합니다. 데이터가 암호화된 경우 추가 자격 증명이 필요합니다. 자세한 내용은 COPY 명령 참조의 권한 부여 파라미터 섹션을 참조하세요. 액세스 관리에 대한 자세한 내용은 Amazon S3 리소스에 대한 액세스 권한 관리 섹션을 참조하세요.
옵션
COPY 명령에 여러 파라미터를 지정하면 파일 형식을 지정하고, 데이터 형식을 관리하고, 오류를 관리하고, 다른 기능을 제어할 수 있습니다. 이 자습서에서 사용하는 COPY 명령 옵션과 기능은 다음과 같습니다.
-
키 접두사
키 접두사를 지정하여 여러 파일에서 로드하는 방법에 대한 자세한 내용은 NULL AS를 사용하여 PART 테이블 로드 섹션을 참조하세요.
-
CSV 형식
CSV 형식의 데이터를 로드하는 방법에 대한 자세한 내용은 NULL AS를 사용하여 PART 테이블 로드 섹션을 참조하세요.
-
NULL AS
NULL AS 옵션을 사용하여 PART를 로드하는 방법에 대한 자세한 내용은 NULL AS를 사용하여 PART 테이블 로드 섹션을 참조하세요.
-
문자로 구분된 형식
DELIMITER 옵션을 사용하는 방법에 대한 자세한 내용은 REGION을 사용하여 SUPPLIER 테이블 로드 섹션을 참조하세요.
-
REGION
REGION 옵션을 사용하는 방법에 대한 자세한 내용은 REGION을 사용하여 SUPPLIER 테이블 로드 섹션을 참조하세요.
-
고정 형식 너비
고정 너비 데이터에서 CUSTOMER 테이블을 로드하는 방법에 대한 자세한 내용은 MANIFEST를 사용하여 CUSTOMER 테이블 로드 섹션을 참조하세요.
-
MAXERROR
MAXERROR 옵션을 사용하는 방법에 대한 자세한 내용은 MANIFEST를 사용하여 CUSTOMER 테이블 로드 섹션을 참조하세요.
-
ACCEPTINVCHARS
ACCEPTINVCHARS 옵션을 사용하는 방법에 대한 자세한 내용은 MANIFEST를 사용하여 CUSTOMER 테이블 로드 섹션을 참조하세요.
-
MANIFEST
MANIFEST 옵션을 사용하는 방법에 대한 자세한 내용은 MANIFEST를 사용하여 CUSTOMER 테이블 로드 섹션을 참조하세요.
-
DATEFORMAT
DATEFORMAT 옵션을 사용하는 방법에 대한 자세한 내용은 DATEFORMAT을 사용하여 DWDATE 테이블 로드 섹션을 참조하세요.
-
GZIP, LZOP 및 BZIP2
파일 압축 방법에 대한 자세한 내용은 여러 파일을 사용하여 LINEORDER 테이블 로드 섹션을 참조하세요.
-
COMPUPDATE
COMPUPDATE 옵션을 사용하는 방법에 대한 자세한 내용은 여러 파일을 사용하여 LINEORDER 테이블 로드 섹션을 참조하세요.
-
여러 파일
여러 파일을 로드하는 방법에 대한 자세한 내용은 여러 파일을 사용하여 LINEORDER 테이블 로드 섹션을 참조하세요.
SSB 테이블 로드
다음 COPY 명령을 사용하여 SSB 스키마에서 각각의 테이블을 로드합니다. 각 테이블에 대한 명령은 다양한 COPY 옵션과 문제 해결 방법을 보여 줍니다.
SSB 테이블을 로드하려면 다음 단계를 따릅니다.
버킷 이름 및 AWS 자격 증명 대체
이 자습서의 COPY 명령은 다음 형식으로 제시되어 있습니다.
copy table from 's3://
<your-bucket-name>
/load/key_prefix' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' options;
각 COPY 명령에 대해 다음을 수행합니다.
-
<your-bucket-name>
을 클러스터와 같은 리전에 있는 버킷 이름으로 대체합니다.이 단계에서는 버킷과 클러스터가 같은 리전에 있다고 가정합니다. 또는 COPY 명령과 함께 REGION 옵션을 사용하여 리전을 지정할 수 있습니다.
-
<aws-account-id>
와<role-name>
을 사용자의 AWS 계정와 IAM 역할로 바꿉니다. 자격 증명 문자열에서 작은따옴표로 묶이는 구간에는 공백이나 줄 바꿈이 있어서는 안 됩니다. ARN은 샘플과 형식이 약간 다를 수 있습니다. COPY 명령을 실행할 때 정확한지 확인하려면 IAM 콘솔에서 역할에 대한 ARN을 복사하는 것이 가장 좋습니다.
NULL AS를 사용하여 PART 테이블 로드
이 단계에서는 CSV 및 NULL AS 옵션을 사용하여 PART 테이블을 로드합니다.
COPY 명령은 여러 파일에서 데이터를 병렬로 로드할 수 있으므로 단일 파일에서 로드하는 것보다 훨씬 빠릅니다. 이 원리를 보여 주기 위해 이 자습서에서는 각 테이블의 데이터를 아주 작은 여덟 개의 파일로 분할합니다. 이후 단계에서는 단일 파일에서 로드할 때와 여러 파일에서 로드할 때의 시간 차이를 비교합니다. 자세한 내용은 파일에서 데이터 로드 단원을 참조하십시오.
키 접두사
파일 세트의 키 접두사를 지정하거나 매니페스트 파일에서 파일을 명시적으로 나열하여 여러 파일에서 데이터를 로드할 수 있습니다. 이 단계에서는 키 접두사를 사용합니다. 매니페스트 파일은 이후 단계에서 사용합니다. 키 접두사 's3://amzn-s3-demo-bucket/load/part-csv.tbl'
는 load
폴더에 있는 다음 파일 세트를 로드합니다.
part-csv.tbl-000 part-csv.tbl-001 part-csv.tbl-002 part-csv.tbl-003 part-csv.tbl-004 part-csv.tbl-005 part-csv.tbl-006 part-csv.tbl-007
CSV 형식
쉼표로 분리된 값(comma separated value)을 뜻하는 CSV는 스프레드시트 데이터 가져오기 및 내보내기에 사용되는 공통 형식입니다. CSV는 쉼표로 구분된(comma-delimited) 형식보다 더 유연한데, 필드 내에서 따옴표로 묶인 문자열을 포함시킬 수 있기 때문입니다. CSV 형식에서 COPY의 기본 인용 부호는 큰따옴표(")이지만 QUOTE AS 옵션을 사용하면 다른 인용 부호를 지정할 수 있습니다. 필드 안에서 인용 부호를 사용할 때는 추가 인용 부호로 이스케이프 처리해야 합니다.
PART 테이블용 CSV 형식 데이터 파일에서 발췌한 다음 예는 큰따옴표로 묶인 문자열("LARGE ANODIZED
BRASS"
)을 보여줍니다. 또한 따옴표로 묶인 문자열 안에서 2개의 큰따옴표로 묶인 문자열("MEDIUM ""BURNISHED"" TIN"
)도 보여줍니다.
15,dark sky,MFGR#3,MFGR#47,MFGR#3438,indigo,"LARGE ANODIZED BRASS",45,LG CASE 22,floral beige,MFGR#4,MFGR#44,MFGR#4421,medium,"PROMO, POLISHED BRASS",19,LG DRUM 23,bisque slate,MFGR#4,MFGR#41,MFGR#4137,firebrick,"MEDIUM ""BURNISHED"" TIN",42,JUMBO JAR
PART 테이블용 데이터에는 COPY가 실패하도록 하는 문자가 포함되어 있습니다. 이 연습에서는 오류 문제를 해결하고 수정합니다.
CSV 형식인 데이터를 로드하려면 COPY 명령에 csv
를 추가합니다. 다음 명령을 실행하여 PART 테이블을 로드합니다.
copy part from 's3://
<your-bucket-name>
/load/part-csv.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' csv;
다음과 비슷한 오류 메시지가 나타날 수 있습니다.
An error occurred when executing the SQL command: copy part from 's3://amzn-s3-demo-bucket/load/part-csv.tbl' credentials' ... ERROR: Load into table 'part' failed. Check 'stl_load_errors' system table for details. [SQL State=XX000] Execution time: 1.46s 1 statement(s) failed. 1 statement(s) failed.
오류에 대한 자세한 내용을 보려면 STL_LOAD_ERRORS 테이블을 쿼리하십시오. 다음 쿼리는 SUBSTRING 함수를 사용해 읽기 쉽게 열을 줄이고 LIMIT 10을 사용해 반환되는 행의 수를 줄입니다. 버킷 이름의 길이를 감안하여 substring(filename,22,25)
에서 값을 조정할 수 있습니다.
select query, substring(filename,22,25) as filename,line_number as line, substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text, substring(raw_field_value,0,15) as field_text, substring(err_reason,0,45) as reason from stl_load_errors order by query desc limit 10;
query | filename | line | column | type | pos | --------+-------------------------+-----------+------------+------------+-----+---- 333765 | part-csv.tbl-000 | 1 | | | 0 | line_text | field_text | reason ------------------+------------+---------------------------------------------- 15,NUL next, | | Missing newline: Unexpected character 0x2c f
NULL AS
part-csv.tbl
데이터 파일은 NUL 종결자 문자(\x000
또는 \x0
)를 사용하여 NULL 값을 표시합니다.
참고
철자가 매우 비슷함에도 불구하고 NUL과 NULL은 서로 다릅니다. NUL은 레코드 끝(EOR)을 표시하는 데 종종 사용되는 코드포인트 x000
이 포함된 UTF-8 문자입니다. NULL은 데이터 없음을 나타내는 SQL 값입니다.
기본적으로 COPY는 NUL 종결자 문자를 EOR 문자로 취급하고 레코드를 종결하므로 종종 예상치 못한 오류가 발생합니다. 텍스트 데이터에서 NULL을 나타내는 단일 표준 방법은 없습니다. 그러므로 테이블을 로드할 때 NULL AS COPY 명령 옵션을 사용하여 NULL로 대체할 문자를 지정할 수 있습니다. 이 예에서는 COPY가 NUL 종결자 문자를 NULL 문자로 취급하도록 합니다.
참고
NULL 값을 받는 테이블 열은 null을 허용하는 열로 구성되어야 합니다. 다시 말해 CREATE TABLE 사양에서 NOT NULL 제약을 포함해서는 안 됩니다.
NULL AS 옵션을 사용하여 PART를 로드하려면 다음 COPY 명령을 실행합니다.
copy part from 's3://
<your-bucket-name>
/load/part-csv.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' csv null as '\000';
COPY가 NULL 값을 로드했는지 확인하려면 다음 명령을 사용하여 NULL이 포함된 행만 선택합니다.
select p_partkey, p_name, p_mfgr, p_category from part where p_mfgr is null;
p_partkey | p_name | p_mfgr | p_category -----------+----------+--------+------------ 15 | NUL next | | MFGR#47 81 | NUL next | | MFGR#23 133 | NUL next | | MFGR#44 (2 rows)
REGION을 사용하여 SUPPLIER 테이블 로드
이 단계에서는 DELIMITER 및 REGION 옵션을 사용하여 SUPPLIER 테이블을 로드합니다.
참고
SUPPLIER 테이블을 로드하기 위한 파일은 AWS 샘플 버킷에서 제공됩니다. 이 단계에서는 파일을 업로드하지 않아도 됩니다.
문자로 구분된 형식
문자로 구분된 파일의 필드는 파이프 문자( | ), 쉼표( , ) 또는 탭( \t ) 같은 특정 문자로 분리되어 있습니다. 문자로 구분된 파일은 비인쇄 ASCII 문자 중 하나를 포함한 어떤 단일 ASCII 문자도 구분 기호로 사용할 수 있습니다. DELIMITER 옵션을 사용하여 구분 기호 문자를 지정합니다. 기본 구분자는 파이프 문자(|)입니다.
SUPPLIER 테이블용 데이터에서 발췌한 다음 예는 파이프로 구분된 형식을 사용합니다.
1|1|257368|465569|41365|19950218|2-HIGH|0|17|2608718|9783671|4|2504369|92072|2|19950331|TRUCK 1|2|257368|201928|8146|19950218|2-HIGH|0|36|6587676|9783671|9|5994785|109794|6|19950416|MAIL
REGION
가능하다면 항상 Amazon Redshift 클러스터와 동일한 AWS 리전에 로드 데이터를 위치시켜야 합니다. 데이터와 클러스터가 같은 리전에 있으면 대기 시간이 줄어들고 리전 간 데이터 전송 비용을 피할 수 있습니다. 자세한 내용은 데이터 로드에 대한 Amazon Redshift 모범 사례 섹션을 참조하세요.
다른 AWS 리전에서 데이터를 로드해야 하는 경우 REGION 옵션을 사용하여 로드 데이터가 위치한 AWS 리전을 지정합니다. 리전을 지정하는 경우, 매니페스트 파일을 포함한 모든 로드 데이터가 명명된 리전에 있어야 합니다. 자세한 내용은 REGION 단원을 참조하십시오.
클러스터가 미국 동부(버지니아 북부) 리전에 있는 경우 다음 명령을 사용하여 미국 서부(오레곤)에 위치한 Amazon S3 버킷에 있는 파이프로 구분된 데이터에서 SUPPLIER 테이블을 로드합니다. 이 예에서는 버킷 이름을 변경하지 마십시오.
copy supplier from 's3://awssampledbuswest2/ssbgz/supplier.tbl' credentials 'aws_iam_role=arn:aws:iam::
<aws-account-id>
:role/<role-name>
' delimiter '|' gzip region 'us-west-2';
클러스터가 미국 동부(버지니아 북부) 리전에 있지 않은 경우 다음 명령을 사용하여 미국 동부(버지니아 북부)에 위치한 Amazon S3 버킷에 있는 파이프로 구분된 데이터에서 SUPPLIER 테이블을 로드합니다. 이 예에서는 버킷 이름을 변경하지 마십시오.
copy supplier from 's3://awssampledb/ssbgz/supplier.tbl' credentials 'aws_iam_role=arn:aws:iam::
<aws-account-id>
:role/<role-name>
' delimiter '|' gzip region 'us-east-1';
MANIFEST를 사용하여 CUSTOMER 테이블 로드
이 단계에서는 FIXEDWIDTH, MAXERROR, ACCEPTINVCHARS 및 MANIFEST 옵션을 사용하여 CUSTOMER 테이블을 로드합니다.
이 연습의 샘플 데이터에는 COPY가 로드를 시도할 때 실패를 초래하는 문자가 포함되어 있습니다. MAXERRORS 옵션과 STL_LOAD_ERRORS 시스템 테이블을 사용하여 로드 오류 문제를 해결한 다음 ACCEPTINVCHARS 및 MANIFEST 옵션을 사용하여 오류를 제거합니다.
고정 너비 형식
고정 너비 형식은 구분 기호로 필드를 분리하지 않고 각 필드를 고정된 수의 문자로 정의합니다. CUSTOMER 테이블용 데이터에서 발췌한 다음 예는 고정 너비 형식을 사용합니다.
1 Customer#000000001 IVhzIApeRb MOROCCO 0MOROCCO AFRICA 25-705 2 Customer#000000002 XSTf4,NCwDVaWNe6tE JORDAN 6JORDAN MIDDLE EAST 23-453 3 Customer#000000003 MG9kdTD ARGENTINA5ARGENTINAAMERICA 11-783
레이블/폭 페어의 순서는 테이블 열의 순서와 정확히 일치해야 합니다. 자세한 내용은 FIXEDWIDTH 단원을 참조하십시오.
CUSTOMER 테이블 데이터용 고정 너비 사양 문자열은 다음과 같습니다.
fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10'
고정 너비 데이터에서 CUSTOMER 테이블을 로드하려면 다음 명령을 실행합니다.
copy customer from 's3://
<your-bucket-name>
/load/customer-fw.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10';
다음과 비슷한 오류 메시지가 표시됩니다.
An error occurred when executing the SQL command: copy customer from 's3://amzn-s3-demo-bucket/load/customer-fw.tbl' credentials'... ERROR: Load into table 'customer' failed. Check 'stl_load_errors' system table for details. [SQL State=XX000] Execution time: 2.95s 1 statement(s) failed.
MAXERROR
기본적으로 COPY 실행 시 처음 오류가 발생할 때 명령이 실패하고 오류 메시지가 반환됩니다. 테스트 도중 시간을 절약하기 위해 MAXERROR 옵션을 사용하여 실패 전에 지정된 수의 오류를 건너뛰도록 COPY에 명령할 수 있습니다. CUSTOMER 테이블 데이터 로드를 처음 테스트할 때 오류를 예상하기 때문에 COPY 명령에 maxerror 10
을 추가합니다.
FIXEDWIDTH 및 MAXERROR 옵션을 사용하여 테스트하려면 다음 명령을 실행합니다.
copy customer from 's3://
<your-bucket-name>
/load/customer-fw.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10' maxerror 10;
이번에는 오류 메시지 대신 다음과 비슷한 경고 메시지가 나타납니다.
Warnings: Load into table 'customer' completed, 112497 record(s) loaded successfully. Load into table 'customer' completed, 7 record(s) could not be loaded. Check 'stl_load_errors' system table for details.
경고는 COPY 실행 시 일곱 번 오류가 발생했음을 나타냅니다. 오류를 확인하려면 다음 예에 나온 것처럼 STL_LOAD_ERRORS 테이블을 쿼리하십시오.
select query, substring(filename,22,25) as filename,line_number as line, substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text, substring(raw_field_value,0,15) as field_text, substring(err_reason,0,45) as error_reason from stl_load_errors order by query desc, filename limit 7;
STL_LOAD_ERRORS 쿼리 결과가 다음과 비슷해야 합니다.
query | filename | line | column | type | pos | line_text | field_text | error_reason --------+---------------------------+------+-----------+------------+-----+-------------------------------+------------+---------------------------------------------- 334489 | customer-fw.tbl.log | 2 | c_custkey | int4 | -1 | customer-fw.tbl | customer-f | Invalid digit, Value 'c', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 6 | c_custkey | int4 | -1 | Complete | Complete | Invalid digit, Value 'C', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 3 | c_custkey | int4 | -1 | #Total rows | #Total row | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 5 | c_custkey | int4 | -1 | #Status | #Status | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 1 | c_custkey | int4 | -1 | #Load file | #Load file | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl000 | 1 | c_address | varchar | 34 | 1 Customer#000000001 | .Mayag.ezR | String contains invalid or unsupported UTF8 334489 | customer-fw.tbl000 | 1 | c_address | varchar | 34 | 1 Customer#000000001 | .Mayag.ezR | String contains invalid or unsupported UTF8 (7 rows)
결과를 검사하면 error_reasons
열에 2개의 메시지가 있음을 볼 수 있습니다.
-
Invalid digit, Value '#', Pos 0, Type: Integ
이 오류의 원인은
customer-fw.tbl.log
파일입니다. 문제는 이것이 데이터 파일이 아니라 로그 파일이며, 로드되어서는 안 된다는 것입니다. 매니페스트 파일을 사용하면 잘못된 파일이 로드되는 것을 피할 수 있습니다. -
String contains invalid or unsupported UTF8
VARCHAR 데이터 형식은 최대 3바이트의 멀티바이트 UTF-8 문자를 지원합니다. 지원되지 않거나 잘못된 문자가 로드 데이터에 포함된 경우, ACCEPTINVCHARS 옵션을 사용하여 잘못된 각각의 문자를 지정된 다른 문자로 대체할 수 있습니다.
로드의 또 다른 문제는 감지하기가 더 어렵습니다. 로드로 인해 예기치 않은 결과가 발생했습니다. 이 문제를 조사하려면 다음 명령을 실행하여 CUSTOMER 테이블을 쿼리합니다.
select c_custkey, c_name, c_address from customer order by c_custkey limit 10;
c_custkey | c_name | c_address -----------+---------------------------+--------------------------- 2 | Customer#000000002 | XSTf4,NCwDVaWNe6tE 2 | Customer#000000002 | XSTf4,NCwDVaWNe6tE 3 | Customer#000000003 | MG9kdTD 3 | Customer#000000003 | MG9kdTD 4 | Customer#000000004 | XxVSJsL 4 | Customer#000000004 | XxVSJsL 5 | Customer#000000005 | KvpyuHCplrB84WgAi 5 | Customer#000000005 | KvpyuHCplrB84WgAi 6 | Customer#000000006 | sKZz0CsnMD7mp4Xd0YrBvx 6 | Customer#000000006 | sKZz0CsnMD7mp4Xd0YrBvx (10 rows)
행들이 고유해야 하지만 중복된 행이 있습니다.
예상치 못한 결과를 검사하는 또 다른 방법은 로드된 행의 수를 확인하는 것입니다. 이 경우, 100,000개의 행이 로드되어야 하지만 로드 메시지는 112,497개의 레코드를 로드했다고 보고했습니다. 이 여분의 행은 불필요한 파일인 customer-fw.tbl0000.bak
을 COPY가 로드했기 때문에 로드되었습니다.
이 연습에서는 잘못된 파일이 로드되는 것을 방지하기 위해 매니페스트 파일을 사용합니다.
ACCEPTINVCHARS
기본적으로 COPY는 열의 데이터 형식이 지원하지 않는 문자가 있으면 행을 건너뛰고 오류를 반환합니다. 잘못된 UTF-8 문자에 대한 자세한 내용은 멀티바이트 문자 로드 오류 섹션을 참조하세요.
MAXERRORS 옵션을 사용하여 오류를 무시하고 로드를 계속한 다음 STL_LOAD_ERRORS를 쿼리해 잘못된 문자를 찾은 후 데이터 파일을 수정할 수 있습니다. 하지만 MAXERRORS는 로드 문제 해결에 사용하는 것이 가장 좋으며, 일반적으로 프로덕션 환경에서는 사용하지 말아야 합니다.
잘못된 문자를 관리하는 데는 일반적으로 ACCEPTINVCHARS 옵션을 택하는 것이 더 좋습니다. ACCEPTINVCHARS는 COPY에게 잘못된 각 문자를 지정된 유효한 문자로 대체하고 로드 작업을 계속하라고 명령합니다. NULL을 제외한 어떤 ASCII 문자도 대체 문자로 지정할 수 있습니다. 기본 대체 문자는 물음표(?)입니다. COPY는 멀티바이트 문자를 같은 길이의 대체 문자열로 대체합니다. 예를 들어 4바이트 문자는 '????'
로 대체됩니다.
COPY는 유효하지 않은 UTF-8 문자가 포함된 행 수를 반환합니다. 또한 영향을 받는 각 행에 대해 STL_REPLACEMENTS 시스템 테이블에 노드 조각당 최대 100행까지 항목을 추가합니다. 이후 추가되는 잘못된 UTF-8 문자 역시 변경되지만 이러한 문자의 변경 이벤트는 기록되지 않습니다.
ACCEPTINVCHARS는 VARCHAR 열에서만 유효합니다.
이 단계에서는 대체 문자 '^'
과 함께 ACCEPTINVCHARS를 추가합니다.
MANIFEST
키 접두사를 사용하여 Amazon S3에서 COPY를 실행할 때는 원치 않는 테이블이 로드될 위험이 있습니다. 예를 들어 's3://amzn-s3-demo-bucket/load/
폴더에는 키 접두사 customer-fw.tbl
: customer-fw.tbl0000
, customer-fw.tbl0001
등을 공유하는 8개의 데이터 파일이 포함되어 있습니다. 하지만 같은 폴더에 불필요한 파일인 customer-fw.tbl.log
와 customer-fw.tbl-0001.bak
도 포함되어 있습니다.
올바른 파일만 모두 로드하려면 매니페스트 파일을 사용하십시오. 매니페스트는 로드할 각 원본 파일의 고유한 객체 키를 명시적으로 나열하는 JSON 형식의 텍스트 파일입니다. 파일 객체는 서로 다른 폴더나 버킷에 있을 수 있지만 리전은 같아야 합니다. 자세한 내용은 MANIFEST 단원을 참조하십시오.
다음은 customer-fw-manifest
텍스트를 보여줍니다.
{ "entries": [ {"url":"s3://
<your-bucket-name>
/load/customer-fw.tbl-000"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-001"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-002"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-003"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-004"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-005"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-006"}, {"url":"s3://<your-bucket-name>
/load/customer-fw.tbl-007"} ] }
매니페스트 파일을 사용하여 CUSTOMER 테이블의 데이터를 로드하려면
-
텍스트 편집기에서 파일을 엽니다.
customer-fw-manifest
-
<your-bucket-name>
을 버킷의 이름으로 바꿉니다. -
파일을 저장합니다.
-
파일을 버킷의 로드 폴더에 업로드합니다.
-
다음 COPY 명령을 실행합니다.
copy customer from 's3://
<your-bucket-name>
/load/customer-fw-manifest' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10' maxerror 10 acceptinvchars as '^' manifest;
DATEFORMAT을 사용하여 DWDATE 테이블 로드
이 단계에서는 DELIMITER 및 DATEFORMAT 옵션을 사용하여 DWDATE 테이블을 로드합니다.
DATE 및 TIMESTAMP 열을 로드할 때 COPY는 기본 형식(날짜는 YYYY-MM-DD, 타임스탬프는 YYYY-MM-DD HH:MI:SS)을 예상합니다. 로드 데이터가 기본 형식을 사용하지 않는 경우, DATEFORMAT 및 TIMEFORMAT을 사용하여 형식을 지정할 수 있습니다.
발췌한 다음 예는 DWDATE 테이블의 날짜 형식을 보여 줍니다. 열 2의 날짜 형식이 일관되지 않다는 점을 눈여겨보십시오.
19920104 1992-01-04 Sunday January 1992 199201 Jan1992 1 4 4 1... 19920112 January 12, 1992 Monday January 1992 199201 Jan1992 2 12 12 1... 19920120 January 20, 1992 Tuesday January 1992 199201 Jan1992 3 20 20 1...
DATEFORMAT
날짜 형식은 하나만 지정할 수 있습니다. 로드 데이터에 서로 다른 열에서 일관되지 않은 형식이 포함되어 있거나 형식이 로드 시에 알려지지 않은 경우, 'auto'
인수와 함께 DATEFORMAT을 사용합니다. 'auto'
가 지정되면 COPY는 유효한 날짜 또는 시간 형식을 인식하여 이를 기본 형식으로 변환합니다. 'auto'
옵션은 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. 자세한 내용은 DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용 단원을 참조하십시오.
DWDATE 테이블을 로드하려면 다음 COPY 명령을 실행합니다.
copy dwdate from 's3://
<your-bucket-name>
/load/dwdate-tab.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>
:role/<role-name>
' delimiter '\t' dateformat 'auto';
여러 파일을 사용하여 LINEORDER 테이블 로드
이 단계에서는 GZIP 및 COMPUPDATE 옵션을 사용하여 LINEORDER 테이블을 로드합니다.
이 연습에서는 단일 데이터 파일에서 LINEORDER 테이블을 로드한 다음 여러 파일에서 다시 로드합니다. 이렇게 하면 두 방법의 로드 시간을 비교할 수 있습니다.
참고
LINEORDER 테이블을 로드하기 위한 파일은 AWS 샘플 버킷에서 제공됩니다. 이 단계에서는 파일을 업로드하지 않아도 됩니다.
GZIP, LZOP 및 BZIP2
gzip, lzop 또는 bzip2 압축 형식을 사용하여 파일을 압축할 수 있습니다. 압축된 파일에서 로드하면 COPY가 로드 프로세스 중에 파일 압축을 해제합니다. 파일을 압축하면 스토리지 공간이 절약되고 업로드 시간이 단축됩니다.
COMPUPDATE
압축 인코딩 없는 빈 테이블을 로드하는 경우, COPY는 로드 데이터를 분석하여 최적의 인코딩을 결정합니다. 그런 다음 로드를 시작하기 전에 이러한 인코딩을 사용하도록 테이블을 변경합니다. 이 분석 프로세스는 시간이 걸리지만 테이블당 최대 한 번 실행됩니다. 시간을 절약하려면 COMPUPDATE를 꺼서 이 단계를 건너뛸 수 있습니다. COPY 시간의 정확한 평가가 가능하도록 하려면 이 단계에서 COMPUPDATE를 끄십시오.
여러 파일
COPY 명령은 단일 파일에서 로드하는 대신 여러 파일에서 데이터를 병렬로 로드할 때 데이터를 매우 효율적으로 로드할 수 있습니다. 파일 수가 클러스터에 있는 조각 수의 배수가 되도록 데이터를 파일로 분할할 수 있습니다. 이 경우 Amazon Redshift는 워크로드를 분할하고 슬라이스 간에 데이터를 균등하게 배포합니다. 노드당 조각 수는 클러스터의 노드 크기에 따라 달라집니다. 각 노드 크기의 슬라이스 수에 대한 자세한 내용은 Amazon Redshift 관리 가이드의 클러스터 및 노드 정보 섹션을 참조하세요.
예를 들어 이 자습서에서 사용하는 dc2.large 컴퓨팅 노드는 각각 조각이 2개입니다. 따라서 4노드 클러스터는 총 8개의 조각을 갖게 됩니다. 앞 단계에서는 파일이 매우 작음에도 불구하고 여덟 개의 파일에 로드 데이터가 포함되었습니다. 이 단계에서는 큰 단일 파일에서 로드할 때와 여러 파일에서 로드할 때의 시간 차이를 비교합니다.
이 자습서에서 사용할 파일에는 약 1,500만 개의 레코드가 포함되며, 약 1.2GB를 차지합니다. 이 파일들은 Amazon Redshift 규모에서는 매우 작지만 여러 파일에서 로드할 경우의 성능상 장점을 보여주는 데는 충분합니다. 파일을 다운로드한 다음 Amazon S3에 업로드하는 데 필요한 시간이 이 튜토리얼에서 다루기에 너무 큽니다. 따라서 AWS 샘플 버킷에서 직접 파일을 로드합니다.
다음 스크린샷은 LINEORDER를 위한 데이터 파일을 보여 줍니다.
여러 파일에서의 COPY 성능을 평가하려면
-
다음 명령을 실행하여 단일 파일에서 COPY합니다. 버킷 이름은 변경하지 마십시오.
copy lineorder from 's3://awssampledb/load/lo/lineorder-single.tbl' credentials 'aws_iam_role=arn:aws:iam::
<aws-account-id>
:role/<role-name>
' gzip compupdate off region 'us-east-1'; -
결과는 다음과 비슷해야 합니다. 실행 시간을 적어 둡니다.
Warnings: Load into table 'lineorder' completed, 14996734 record(s) loaded successfully. 0 row(s) affected. copy executed successfully Execution time: 51.56s
-
다음 명령을 실행하여 여러 파일에서 COPY합니다. 버킷 이름은 변경하지 마십시오.
copy lineorder from 's3://awssampledb/load/lo/lineorder-multi.tbl' credentials 'aws_iam_role=arn:aws:iam::
<aws-account-id>
:role/<role-name>
' gzip compupdate off region 'us-east-1'; -
결과는 다음과 비슷해야 합니다. 실행 시간을 적어 둡니다.
Warnings: Load into table 'lineorder' completed, 14996734 record(s) loaded successfully. 0 row(s) affected. copy executed successfully Execution time: 17.7s
-
실행 시간을 비교합니다.
우리 예에서는 1,500만 개의 레코드를 로드하는 시간이 51.56초에서 17.7초로 줄어들어 65.7퍼센트 단축되었습니다.
이 결과는 4노드 클러스터 사용을 기준으로 한 것입니다. 클러스터에 더 많은 노드가 있는 경우, 시간이 더욱 단축됩니다. 수십에서 수백 개의 노드가 있는 일반적인 Amazon Redshift 클러스터의 경우 이 차이는 더 크게 벌어집니다. 단일 노드 클러스터인 경우, 실행 시간의 차이가 거의 없습니다.
6단계: 데이터베이스 vacuum 및 분석
상당히 많은 행을 추가, 삭제 또는 수정할 때마다 VACUUM 명령을 실행한 다음 ANALYZE 명령을 실행해야 합니다. vacuum은 삭제된 행에서 공간을 회수하고 정렬 순서를 복원합니다. ANALYZE 명령은 통계 메타데이터를 업데이트하므로 쿼리 옵티마이저가 더 정확한 쿼리 계획을 생성할 수 있습니다. 자세한 내용은 테이블 Vacuum 단원을 참조하십시오.
데이터를 정렬 키 순서로 로드하는 경우에는 vacuum이 빠릅니다. 이 자습서에서 상당히 많은 행을 추가했지만 빈 테이블에 추가한 것입니다. 따라서 재정렬할 필요가 없고 삭제한 행도 없습니다. COPY는 빈 테이블을 로드한 후 자동으로 통계를 업데이트하므로 통계는 최신 상태입니다. 다만 깔끔한 정리를 위해 데이터베이스에 대해 vacuum을 수행하고 분석하여 이 자습서를 마치십시오.
데이터베이스를 vacuum하고 분석하려면 다음 명령을 실행합니다.
vacuum; analyze;
7단계: 리소스 정리
클러스터는 실행하는 동안 계속해서 요금이 발생합니다. 이 튜토리얼을 완료하면 Amazon Redshift 시작 안내서의 5단계: 액세스 취소 및 샘플 클러스터 삭제 단계에 따라 환경을 이전 상태로 되돌려야 합니다.
클러스터를 유지하면서 SSB 테이블에서 사용한 스토리지를 복원하고 싶다면 다음 명령을 실행하세요.
drop table part; drop table supplier; drop table customer; drop table dwdate; drop table lineorder;
Next
요약
이 튜토리얼에서는 데이터 파일을 Amazon S3에 업로드한 다음 COPY 명령을 사용하여 파일에서 Amazon Redshift 테이블로 데이터를 로드했습니다.
데이터를 로드할 때 사용한 형식은 다음과 같습니다.
-
문자로 구분된 형식
-
CSV
-
고정 너비 형식
STL_LOAD_ERRORS 시스템 테이블을 사용하여 로드 오류 문제를 해결한 다음 REGION, MANIFEST, MAXERROR, ACCEPTINVCHARS, DATEFORMAT 및 NULL AS 옵션을 사용하여 오류를 해결했습니다.
데이터 로드에 다음의 모범 사례를 적용했습니다.
Amazon Redshift 모범 사례에 대한 자세한 내용은 다음 링크를 참조하세요.