UNLOAD 예
이 예제에서는 UNLOAD 명령의 다양한 파라미터를 보여줍니다. 많은 예제에서 TICKIT 샘플 데이터가 사용됩니다. 자세한 내용은 샘플 데이터베이스 단원을 참조하십시오.
참고
여기에서 설명하는 예는 가독성을 위해 줄 바꿈이 포함되었습니다. 실제 credentials-args 문자열에서는 줄 바꿈이나 공백을 입력하지 마십시오.
파이프(기본 구분 기호)로 구분된 파일로 VENUE 언로드
다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/
에 데이터를 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
기본적으로, UNLOAD는 조각당 하나 이상의 파일을 작성합니다. 노드당 2개의 조각이 있는 2노드 클러스터를 가정할 때, 이전의 예에서는 다음 파일이 amzn-s3-demo-bucket
에 생성됩니다.
unload/0000_part_00 unload/0001_part_00 unload/0002_part_00 unload/0003_part_00
출력 파일을 더 효과적으로 구분하려면 해당 위치에 접두사를 포함하면 됩니다. 다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/venue_pipe_
에 데이터를 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
그 결과, unload
폴더에 다음 4개의 파일이 있으며, 이때도 4개의 조각이 있는 것으로 가정합니다.
venue_pipe_0000_part_00 venue_pipe_0001_part_00 venue_pipe_0002_part_00 venue_pipe_0003_part_00
분할된 Parquet 파일에 LINEITE 테이블 언로드
다음 예에서는 LINEITEM 테이블을 l_shipdate
열로 분할하여 Parquet 형식으로 언로드합니다.
unload ('select * from lineitem') to 's3://amzn-s3-demo-bucket/lineitem/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' PARQUET PARTITION BY (l_shipdate);
네 개의 조각을 가정할 때 결과 Parquet 파일은 다양한 폴더에 동적으로 분할됩니다.
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-02/0000_part_00.parquet 0001_part_00.parquet 0002_part_00.parquet 0003_part_00.parquet s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-03/0000_part_00.parquet 0001_part_00.parquet 0002_part_00.parquet 0003_part_00.parquet s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-04/0000_part_00.parquet 0001_part_00.parquet 0002_part_00.parquet 0003_part_00.parquet ...
참고
경우에 따라 UNLOAD 명령에서 다음 SQL 문과 같이 INCLUDE 옵션을 사용했습니다.
unload ('select * from lineitem') to 's3://amzn-s3-demo-bucket/lineitem/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' PARQUET PARTITION BY (l_shipdate) INCLUDE;
이러한 경우 l_shipdate
열은 Parquet 파일의 데이터에도 있습니다. 그렇지 않은 경우 l_shipdate
열 데이터가 Parquet 파일에 없습니다.
JSON 파일로 VENUE 테이블 언로드
다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/
에 JSON 형식의 데이터를 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' JSON;
다음은 VENUE 테이블의 샘플 행입니다.
venueid | venuename | venuecity | venuestate | venueseats --------+----------------------------+-----------------+------------+----------- 1 | Pinewood Racetrack | Akron | OH | 0 2 | Columbus "Crew" Stadium | Columbus | OH | 0 4 | Community, Ballpark, Arena | Kansas City | KS | 0
JSON으로 언로드한 후 파일의 형식은 다음과 유사합니다.
{"venueid":1,"venuename":"Pinewood Racetrack","venuecity":"Akron","venuestate":"OH","venueseats":0} {"venueid":2,"venuename":"Columbus \"Crew\" Stadium ","venuecity":"Columbus","venuestate":"OH","venueseats":0} {"venueid":4,"venuename":"Community, Ballpark, Arena","venuecity":"Kansas City","venuestate":"KS","venueseats":0}
CSV 파일로 VENUE 언로드
다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/
에 CSV 형식의 데이터를 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' CSV;
VENUE 테이블에 다음 행이 포함되어 있다고 가정합니다.
venueid | venuename | venuecity | venuestate | venueseats --------+----------------------------+-----------------+------------+----------- 1 | Pinewood Racetrack | Akron | OH | 0 2 | Columbus "Crew" Stadium | Columbus | OH | 0 4 | Community, Ballpark, Arena | Kansas City | KS | 0
언로드 파일은 다음과 유사합니다.
1,Pinewood Racetrack,Akron,OH,0 2,"Columbus ""Crew"" Stadium",Columbus,OH,0 4,"Community, Ballpark, Arena",Kansas City,KS,0
구분 기호를 사용하여 CSV 파일로 VENUE 언로드
다음 예제에서는 VENUE 테이블을 언로드하고 파이프 문자(|)를 구분 기호로 사용하여 데이터를 CSV 형식으로 씁니다. 언로드된 파일이 s3://amzn-s3-demo-bucket/unload/
에 기록됩니다. 이 예제의 VENUE 테이블에는 첫 번째 행의 값에 파이프 문자가 포함되어 있습니다(Pinewood Race|track
). 이는 결과의 값이 큰따옴표로 묶여 있음을 보여 줍니다. 큰따옴표는 큰따옴표로 이스케이프되고 전체 필드는 큰따옴표로 묶여 있습니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' CSV DELIMITER AS '|';
VENUE 테이블에 다음 행이 포함되어 있다고 가정합니다.
venueid | venuename | venuecity | venuestate | venueseats --------+----------------------------+-----------------+------------+------------- 1 | Pinewood Race|track | Akron | OH | 0 2 | Columbus "Crew" Stadium | Columbus | OH | 0 4 | Community, Ballpark, Arena | Kansas City | KS | 0
언로드 파일은 다음과 유사합니다.
1|"Pinewood Race|track"|Akron|OH|0 2|"Columbus ""Crew"" Stadium"|Columbus|OH|0 4|Community, Ballpark, Arena|Kansas City|KS|0
매니페스트 파일로 VENUE 언로드
매니페스트 파일을 생성하려면 MANIFEST 옵션을 포함하십시오. 다음 예에서는 VENUE 테이블을 언로드하고 데이터 파일과 함께 매니페스트 파일을 s3://amzn-s3-demo-bucket/venue_pipe_에 씁니다.
중요
MANIFEST 옵션으로 파일을 언로드하는 경우 파일을 로드할 때 COPY 명령과 함께 MANIFEST 옵션을 사용해야 합니다. 같은 접두사를 사용하여 파일을 로드하고 MANIFEST 옵션을 지정하지 않는 경우 COPY 작업에서는 매니페스트 파일이 데이터 파일이라 가정하므로 COPY가 실패하게 됩니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;
그 결과는 다음과 같은 5개의 파일입니다.
s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00 s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00 s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00 s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00 s3://amzn-s3-demo-bucket/venue_pipe_manifest
다음은 매니페스트 파일 내용을 나타낸 것입니다.
{ "entries": [ {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"}, {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"}, {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"}, {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"} ] }
MANIFEST VERBOSE를 사용해 VENUE 언로드
MANIFEST VERBOSE 옵션을 지정하면 매니페스트 파일에는 다음 섹션이 포함됩니다.
-
entries
섹션에는 Amazon S3 경로, 파일 크기 및 각 파일에 대한 행 수가 나열됩니다. -
schema
섹션에는 열 이름, 데이터 유형, 및 각 열에 대한 차원이 나열됩니다. -
meta
섹션에는 총 파일 크기 및 모든 파일의 행 수가 표시됩니다.
다음 예에서는 MANIFEST VERBOSE 옵션을 사용하여 VENUE 테이블을 언로드합니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload_venue_folder/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest verbose;
다음은 매니페스트 파일 내용을 나타낸 것입니다.
{ "entries": [ {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00", "meta": { "content_length": 32295, "record_count": 10 }}, {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00", "meta": { "content_length": 32771, "record_count": 20 }}, {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00", "meta": { "content_length": 32302, "record_count": 10 }}, {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00", "meta": { "content_length": 31810, "record_count": 15 }} ], "schema": { "elements": [ {"name": "venueid", "type": { "base": "integer" }}, {"name": "venuename", "type": { "base": "character varying", 25 }}, {"name": "venuecity", "type": { "base": "character varying", 25 }}, {"name": "venuestate", "type": { "base": "character varying", 25 }}, {"name": "venueseats", "type": { "base": "character varying", 25 }} ] }, "meta": { "content_length": 129178, "record_count": 55 }, "author": { "name": "Amazon Redshift", "version": "1.0.0" } }
헤더로 VENUE 언로드
다음 예에서는 헤더 행으로 VENUE를 언로드합니다.
unload ('select * from venue where venueseats > 75000') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' header parallel off;
다음은 헤더 행을 포함하는 출력 파일 내용을 보여 줍니다.
venueid|venuename|venuecity|venuestate|venueseats 6|New York Giants Stadium|East Rutherford|NJ|80242 78|INVESCO Field|Denver|CO|76125 83|FedExField|Landover|MD|91704 79|Arrowhead Stadium|Kansas City|MO|79451
더 작은 크기의 파일로 VENUE 언로드
최대 파일 크기의 기본값은 6.2GB입니다. 언로드 데이터가 6.2GB보다 큰 경우 UNLOAD는 각각의 6.2GB 데이터 세그먼트에 대한 새 파일을 생성합니다. 더 작은 크기의 파일을 생성하려면 MAXFILESIZE 파라미터를 추가하십시오. 이전 예에서 데이터 크기가 20GB라고 가정했을 때 다음 UNLOAD 명령은 각각 1GB씩 20개의 파일을 생성합니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' maxfilesize 1 gb;
VENUE의 연속 언로드
연속으로 언로드하려면 PARALLEL OFF를 지정하십시오. 그러면 UNLOAD가 한 번에 한 개의 파일을 쓰는데, 파일당 최대 6.2GB의 데이터를 씁니다.
다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/
에 데이터를 연속으로 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/venue_serial_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' parallel off;
그 결과 venue_serial_000이라는 파일이 한 개 생성됩니다.
언로드 데이터가 6.2GB보다 큰 경우 UNLOAD는 각각의 6.2GB 데이터 세그먼트에 대한 새 파일을 생성합니다. 다음 예에서는 LINEORDER 테이블을 언로드하고 s3://amzn-s3-demo-bucket/unload/
에 데이터를 연속으로 씁니다.
unload ('select * from lineorder') to 's3://amzn-s3-demo-bucket/unload/lineorder_serial_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' parallel off gzip;
그 결과는 다음과 같은 일련의 파일입니다.
lineorder_serial_0000.gz lineorder_serial_0001.gz lineorder_serial_0002.gz lineorder_serial_0003.gz
출력 파일을 더 효과적으로 구분하려면 해당 위치에 접두사를 포함하면 됩니다. 다음 예에서는 VENUE 테이블을 언로드하고 s3://amzn-s3-demo-bucket/venue_pipe_
에 데이터를 씁니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/unload/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
그 결과, unload
폴더에 다음 4개의 파일이 있으며, 이때도 4개의 조각이 있는 것으로 가정합니다.
venue_pipe_0000_part_00 venue_pipe_0001_part_00 venue_pipe_0002_part_00 venue_pipe_0003_part_00
언로드 파일에서 VENUE 로드
언로드 파일 집합에서 테이블을 로드하려면 COPY 명령을 사용하여 단순히 절차를 거꾸로 진행하십시오. 다음 예에서는 새 테이블인 LOADVENUE를 생성하고 이전 예에서 생성된 데이터 파일에서 테이블을 로드합니다.
create table loadvenue (like venue); copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
MANIFEST 옵션을 사용하여 언로드 파일로 매니페스트 파일을 생성한 경우 동일한 매니페스트 파일을 사용하여 데이터를 로드할 수 있습니다. MANIFEST 옵션과 함께 COPY 명령을 사용하면 이렇게 할 수 있습니다. 다음 예에서는 매니페스트 파일을 사용하여 데이터를 로드합니다.
copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;
암호화된 파일로 VENUE 언로드
다음 예에서는 AWS KMS 키를 사용하여 암호화된 파일 집합으로 VENUE 테이블을 언로드합니다. ENCRYPTED 옵션으로 매니페스트 파일을 지정하는 경우 매니페스트 파일도 암호화됩니다. 자세한 내용은 암호화된 데이터 파일 언로드 단원을 참조하십시오.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_encrypt_kms' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' kms_key_id '1234abcd-12ab-34cd-56ef-1234567890ab' manifest encrypted;
다음 예에서는 루트 대칭 키를 사용하여 암호화된 파일 집합으로 VENUE 테이블을 언로드합니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_encrypt_cmk' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722' encrypted;
암호화된 파일에서 VENUE 로드
ENCRYPT 옵션과 함께 UNLOAD를 사용해 생성한 파일 집합에서 테이블을 로드하려면 COPY 명령을 사용해 이 프로세스를 거꾸로 수행하십시오. 이 명령과 함께 ENCRYPTED 옵션을 사용하고 UNLOAD 명령에 사용한 것과 동일한 루트 대치 키를 지정합니다. 다음 예에서는 이전 예에서 생성된 암호화된 데이터 파일에서 LOADVENUE 테이블을 로드합니다.
create table loadvenue (like venue); copy loadvenue from 's3://amzn-s3-demo-bucket/venue_encrypt_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722' manifest encrypted;
VENUE 데이터를 탭으로 구분된 파일로 언로드
unload ('select venueid, venuename, venueseats from venue') to 's3://amzn-s3-demo-bucket/venue_tab_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter as '\t';
출력 데이터 파일의 모습은 다음과 같습니다.
1 Toyota Park Bridgeview IL 0 2 Columbus Crew Stadium Columbus OH 0 3 RFK Stadium Washington DC 0 4 CommunityAmerica Ballpark Kansas City KS 0 5 Gillette Stadium Foxborough MA 68756 ...
고정 폭 데이터 파일로 VENUE 언로드
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_fw_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' fixedwidth as 'venueid:3,venuename:39,venuecity:16,venuestate:2,venueseats:6';
출력 데이터 파일은 다음과 같을 것입니다.
1 Toyota Park Bridgeview IL0 2 Columbus Crew Stadium Columbus OH0 3 RFK Stadium Washington DC0 4 CommunityAmerica BallparkKansas City KS0 5 Gillette Stadium Foxborough MA68756 ...
탭으로 구분된 GZIP 압축 파일 집합으로 VENUE 언로드
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_tab_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter as '\t' gzip;
VENUE를 GZIP 압축 텍스트 파일로 언로드
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_tab_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' extension 'txt.gz' gzip;
구분 기호를 포함한 데이터 언로드
다음 예에서는 ADDQUOTES 옵션을 사용하여 실제 데이터 필드 중 일부에 쉼표가 있는, 쉼표로 구분된 데이터를 언로드합니다.
먼저, 따옴표가 포함되어 있는 테이블을 만듭니다.
create table location (id int, location char(64)); insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
그런 다음, ADDQUOTES 옵션을 사용하여 데이터를 언로드합니다.
unload ('select id, location from location') to 's3://amzn-s3-demo-bucket/location_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter ',' addquotes;
언로드된 데이터 파일의 모습은 다음과 같습니다.
1,"Phoenix, AZ" 2,"San Diego, CA" 3,"Chicago, IL" ...
조인 쿼리의 결과 언로드
다음 예에서는 창 함수를 포함하는 조인 쿼리의 결과를 언로드합니다.
unload ('select venuecity, venuestate, caldate, pricepaid, sum(pricepaid) over(partition by venuecity, venuestate order by caldate rows between 3 preceding and 3 following) as winsum from sales join date on sales.dateid=date.dateid join event on event.eventid=sales.eventid join venue on event.venueid=venue.venueid order by 1,2') to 's3://amzn-s3-demo-bucket/tickit/winsum' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
출력 파일의 모습은 다음과 같습니다.
Atlanta|GA|2008-01-04|363.00|1362.00 Atlanta|GA|2008-01-05|233.00|2030.00 Atlanta|GA|2008-01-06|310.00|3135.00 Atlanta|GA|2008-01-08|166.00|8338.00 Atlanta|GA|2008-01-11|268.00|7630.00 ...
NULL AS를 사용한 언로드
UNLOAD는 기본적으로 null 값을 빈 문자열로 출력합니다. 다음 예에서는 NULL AS를 사용하여 null에 대한 텍스트 문자열을 대체하는 방법을 보여 줍니다.
이들 예에서는 VENUE 테이블에 null 값을 추가할 것입니다.
update venue set venuestate = NULL where venuecity = 'Cleveland';
열에 NULL이 포함되어 있음을 확인하기 위해 VENUESTATE가 null인 VENUE에서 선택합니다.
select * from venue where venuestate is null;
venueid | venuename | venuecity | venuestate | venueseats ---------+--------------------------+-----------+------------+------------ 22 | Quicken Loans Arena | Cleveland | | 0 101 | Progressive Field | Cleveland | | 43345 72 | Cleveland Browns Stadium | Cleveland | | 73200
이제, NULL AS 옵션을 사용해 VENUE 테이블을 UNLOAD하여 null 값을 문자열 'fred
'로 바꿉니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' null as 'fred';
언로드 파일에서 다음 샘플은 null 값이 fred
로 바뀌었음을 보여줍니다. VENUESEATS의 일부 값 역시 null이고 fred
로 바뀐 것으로 나타납니다. VENUESEATS의 데이터 형식이 정수형이지만 UNLOAD가 언로드 파일에서 값을 텍스트로 변환한 다음, COPY가 이를 다시 정수로 변환합니다. 고정 폭 파일로 언로드하는 경우 NULL AS 문자열이 필드 폭보다 크면 안 됩니다.
248|Charles Playhouse|Boston|MA|0 251|Paris Hotel|Las Vegas|NV|fred 258|Tropicana Hotel|Las Vegas|NV|fred 300|Kennedy Center Opera House|Washington|DC|0 306|Lyric Opera House|Baltimore|MD|0 308|Metropolitan Opera|New York City|NY|0 5|Gillette Stadium|Foxborough|MA|5 22|Quicken Loans Arena|Cleveland|fred|0 101|Progressive Field|Cleveland|fred|43345 ...
언로드 파일에서 테이블을 로드하려면 동일한 NULL AS 옵션과 함께 COPY 명령을 사용하십시오.
참고
NULL을 NOT NULL로 정의된 열에 로드하려고 하면 COPY 명령이 실패합니다.
create table loadvenuenulls (like venue); copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' null as 'fred';
열에 빈 문자열뿐 아니라 null이 포함되어 있는지 확인하려면 LOADVENUENULLS에서 선택하고 null이 있는지 필터링하십시오.
select * from loadvenuenulls where venuestate is null or venueseats is null;
venueid | venuename | venuecity | venuestate | venueseats ---------+--------------------------+-----------+------------+------------ 72 | Cleveland Browns Stadium | Cleveland | | 73200 253 | Mirage Hotel | Las Vegas | NV | 255 | Venetian Hotel | Las Vegas | NV | 22 | Quicken Loans Arena | Cleveland | | 0 101 | Progressive Field | Cleveland | | 43345 251 | Paris Hotel | Las Vegas | NV | ...
기본 NULL AS 동작을 사용하여 null이 포함된 테이블을 UNLOAD한 다음 기본 NULL AS 동작을 사용하여 데이터를 테이블로 다시 COPY할 수 있습니다. 하지만 대상 테이블에서 숫자가 아닌 필드는 전부 null이 아니라 빈 문자열을 포함하게 됩니다. 기본적으로 UNLOAD는 null을 빈 문자열(공백 또는 제로 길이)로 변환합니다. COPY는 숫자 열에 대해 빈 문자열을 NULL로 변환하지만, 빈 문자열을 숫자가 아닌 열에 삽입합니다. 다음 예에서는 기본 NULL AS 동작을 사용하여 UNLOAD와 COPY를 차례대로 수행하는 방법을 보여줍니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite; truncate loadvenuenulls; copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
이 경우에는 null을 필터링할 때 VENUESEATS가 null을 포함했던 행만 선택됩니다. 테이블(VENUE)에서 VENUESTATE가 null을 포함한 경우 대상 테이블(LOADVENUENULLS)의 VENUESTATE는 빈 문자열을 포함합니다.
select * from loadvenuenulls where venuestate is null or venueseats is null;
venueid | venuename | venuecity | venuestate | venueseats ---------+--------------------------+-----------+------------+------------ 253 | Mirage Hotel | Las Vegas | NV | 255 | Venetian Hotel | Las Vegas | NV | 251 | Paris Hotel | Las Vegas | NV | ...
빈 문자열을 NULL로서 숫자가 아닌 열에 로드하려면 EMPTYASNULL 또는 BLANKSASNULL 옵션을 포함하십시오. 둘 다 사용해도 괜찮습니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite; truncate loadvenuenulls; copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' EMPTYASNULL;
열에 공백이나 빈 문자열뿐 아니라 NULL이 포함되어 있는지 확인하려면 LOADVENUENULLS에서 선택하고 null이 있는지 필터링합니다.
select * from loadvenuenulls where venuestate is null or venueseats is null;
venueid | venuename | venuecity | venuestate | venueseats ---------+--------------------------+-----------+------------+------------ 72 | Cleveland Browns Stadium | Cleveland | | 73200 253 | Mirage Hotel | Las Vegas | NV | 255 | Venetian Hotel | Las Vegas | NV | 22 | Quicken Loans Arena | Cleveland | | 0 101 | Progressive Field | Cleveland | | 43345 251 | Paris Hotel | Las Vegas | NV | ...
ALLOWOVERWRITE 파라미터를 사용한 언로드
기본적으로 UNLOAD는 대상 버킷의 기존 파일을 덮어쓰지 않습니다. 예를 들어 대상 버킷에서 파일을 수정하지 않고 같은 UNLOAD 문을 두 번 실행하는 경우 두 번째 UNLOAD는 실패하게 됩니다. 매니페스트 파일을 포함하여 기존 파일을 덮어쓰려면 ALLOWOVERWRITE 옵션을 지정합니다.
unload ('select * from venue') to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest allowoverwrite;
PARALLEL 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
테이블을 병렬로 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 0000_part_00
패턴이 접미사로 붙습니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 manifest
텍스트가 접미사로 붙습니다. 다음 SQL은 EVENT 테이블을 언로드하고 기본 이름 parallel
로 파일을 생성합니다.
unload ('select * from mytickit1.event') to 's3://amzn-s3-demo-bucket/parallel' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole' parallel on manifest;
Amazon S3 파일 목록은 다음과 유사합니다.
Name Last modified Size
parallel0000_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB
parallel0001_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
parallel0002_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB
parallel0003_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 51.1 KB
parallel0004_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 54.6 KB
parallel0005_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
parallel0006_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 54.1 KB
parallel0007_part_00 - August 2, 2023, 14:54:39 (UTC-07:00) 55.9 KB
parallelmanifest - August 2, 2023, 14:54:39 (UTC-07:00) 886.0 B
parallelmanifest
파일 콘텐츠는 다음과 유사합니다.
{
"entries": [
{"url":"s3://amzn-s3-demo-bucket/parallel0000_part_00", "meta": { "content_length": 53316 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0001_part_00", "meta": { "content_length": 54704 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0002_part_00", "meta": { "content_length": 53326 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0003_part_00", "meta": { "content_length": 52356 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0004_part_00", "meta": { "content_length": 55933 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0005_part_00", "meta": { "content_length": 54648 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0006_part_00", "meta": { "content_length": 55436 }},
{"url":"s3://amzn-s3-demo-bucket/parallel0007_part_00", "meta": { "content_length": 57272 }}
]
}
PARALLEL OFF 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
테이블을 연속적으로 언로드하고(PARALLEL OFF) 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 0000
패턴이 접미사로 붙습니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 manifest
텍스트가 접미사로 붙습니다.
unload ('select * from mytickit1.event') to 's3://amzn-s3-demo-bucket/serial' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole' parallel off manifest;
Amazon S3 파일 목록은 다음과 유사합니다.
Name Last modified Size
serial0000 - August 2, 2023, 15:54:39 (UTC-07:00) 426.7 KB
serialmanifest - August 2, 2023, 15:54:39 (UTC-07:00) 120.0 B
serialmanifest
파일 콘텐츠는 다음과 유사합니다.
{
"entries": [
{"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
]
}
PARTITION BY 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
파티션별로 테이블을 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3에 하위 파티션 폴더가 있는 새 폴더가 생성되고 하위 폴더의 데이터 파일은 0000_par_00
과 유사한 이름 패턴을 갖습니다. 매니페스트 파일은 하위 폴더와 동일한 폴더 레벨에 있으며 이름은 manifest
입니다.
unload ('select * from mytickit1.event') to 's3://amzn-s3-demo-bucket/partition' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole' partition by (eventname) manifest;
Amazon S3 파일 목록은 다음과 유사합니다.
Name Type Last modified Size
partition Folder
partition
폴더에는 파티션 이름을 가진 하위 폴더와 매니페스트 파일이 있습니다. partition
폴더의 폴더 목록 하단 부분은 다음과 유사합니다.
Name Type Last modified Size
...
eventname=Zucchero/ Folder
eventname=Zumanity/ Folder
eventname=ZZ Top/ Folder
manifest - August 2, 2023, 15:54:39 (UTC-07:00) 467.6 KB
eventname=Zucchero/
폴더에는 다음과 유사한 데이터 파일이 있습니다.
Name Last modified Size
0000_part_00 - August 2, 2023, 15:59:19 (UTC-07:00) 70.0 B
0001_part_00 - August 2, 2023, 15:59:16 (UTC-07:00) 106.0 B
0002_part_00 - August 2, 2023, 15:59:15 (UTC-07:00) 70.0 B
0004_part_00 - August 2, 2023, 15:59:17 (UTC-07:00) 141.0 B
0006_part_00 - August 2, 2023, 15:59:16 (UTC-07:00) 35.0 B
0007_part_00 - August 2, 2023, 15:59:19 (UTC-07:00) 108.0 B
manifest
파일 콘텐츠의 하단은 다음과 유사합니다.
{
"entries": [
...
{"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zucchero/007_part_00", "meta": { "content_length": 108 }},
{"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zumanity/007_part_00", "meta": { "content_length": 72 }}
]
}
MAXFILESIZE, ROWGROUPSIZE 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
테이블을 병렬로 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 0000_part_00
패턴이 접미사로 붙습니다. 생성된 Parquet 데이터 파일은 256MB, 행 그룹 크기는 128MB로 제한됩니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 manifest
가 접미사로 붙습니다.
unload ('select * from mytickit1.event') to 's3://amzn-s3-demo-bucket/eventsize' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole' maxfilesize 256 MB rowgroupsize 128 MB parallel on parquet manifest;
Amazon S3 파일 목록은 다음과 유사합니다.
Name Type Last modified Size
eventsize0000_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 24.5 KB
eventsize0001_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
eventsize0002_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 24.4 KB
eventsize0003_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 24.0 KB
eventsize0004_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 25.3 KB
eventsize0005_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
eventsize0006_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 25.0 KB
eventsize0007_part_00.parquet parquet August 2, 2023, 17:35:21 (UTC-07:00) 25.6 KB
eventsizemanifest - August 2, 2023, 17:35:21 (UTC-07:00) 958.0 B
eventsizemanifest
파일 콘텐츠는 다음과 유사합니다.
{
"entries": [
{"url":"s3://amzn-s3-demo-bucket/eventsize0000_part_00.parquet", "meta": { "content_length": 25130 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0001_part_00.parquet", "meta": { "content_length": 25428 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0002_part_00.parquet", "meta": { "content_length": 25025 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0003_part_00.parquet", "meta": { "content_length": 24554 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0004_part_00.parquet", "meta": { "content_length": 25918 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0005_part_00.parquet", "meta": { "content_length": 25362 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0006_part_00.parquet", "meta": { "content_length": 25647 }},
{"url":"s3://amzn-s3-demo-bucket/eventsize0007_part_00.parquet", "meta": { "content_length": 26256 }}
]
}