터칭 데이터

Redshift 벌크 업데이트(COPY) - 2 본문

데이터 웨어하우스(Data Warehouse)

Redshift 벌크 업데이트(COPY) - 2

터칭 데이터 2023. 11. 28. 23:26

 

S3 생성하기

 

서비스에서 S3를 검색후 클릭합니다.

 

 

 

우측의 버킷 만들기를 클릭하세요.

 

 

 

 

 

저는 버킷 이름을 devjon-test-bucket로 하겠습니다. 여러분은 원하는 대로 지어주세요. 단 버킷 이름은 유니크해야합니다.

 

This is because the bucket name is used in the bucket's URL. For example, if your bucket's name is my-unique-bucket, the URL would be http://my-unique-bucket.s3.amazonaws.com/.

왜냐하면 위의 설명과 같이 버킷 이름이 URL처럼 사용되기 때문입니다.

 

 

그리고 AWS 리전은 Redshift 클러스터를 생성했을 때 정한대로 지정해주세요.

 

다른 모든 옵션들은 변경 없이 그대로 두겠습니다.

 

그리고 우측 하단의 버킷 만들기를 클릭해주세요.

 

 

 

 

 

버킷이 만들어졌습니다. 버킷 이름의 링크를 클릭해주세요.

 

 

 

 

 

 

폴더 만들기를 클릭합니다.

 

 

 

 

 

 

폴더 이름은 test-data로 하겠습니다.

 

다른 설정은 건드리지 않고 폴더 만들기를 클릭합니다.

 

 

 

 

 

 

test_data 폴더가 만들어졌습니다. test_data/ 링크를 클릭합니다.

 

 

 

 

 

 

업로드를 클릭합니다. 상단의 주황색 버튼과 중앙의 하얀색 버튼 어떤 것을 클릭해도 상관 없습니다.

 

 

 

 

 

 

파일 추가 버튼을 누르시거나 직접 끌어다 놓거나 원하시는 대로 파일을 추가해주세요.

 

 

 

 

 

 

파일 4개를 추가한 후 업로드를 클릭하세요.

 

 

 

 

 

 

 

업로드 성공입니다.

 

이중 아무 파일 링크나 클릭합니다.

 

 

 

 

 

 

 

 

그러면 S3 URI에서 문자열을 확인하실 수 있습니다.

 

어딘가 익숙하지 않나요?

 

COPY raw_data.user_session_channel
FROM 's3://devjon-test-bucket/test_data/user_session_channel.csv'
credentials 'aws_iam_role=arn:aws:iam:xxxxxxx:role/redshift.read.s3'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

 

우리가 지난 시간 COPY 쿼리에서 FROM 뒤에 붙는 따옴표 사이의 주소가 바로 S3 URI입니다.

 

 

 

 

자 이쯤에서 우리의 실습 목표를 다시 확인해보겠습니다.

 

이번 COPY 실습의 목표

 

1. CREATE TABLE 명령으로 raw_data 스키마 밑에 테이블 3개를 생성합니다.

 

2. S3의 버킷을 생성합니다.

 

3. 만든 3개의 테이블들에 입력할 레코드(데이터)들이 담긴 CSV파일을 S3 버킷에 복사합니다.

 

4. INSERT INTO가 아닌 COPY 명령을 사용해 raw_data 스키마 밑에 있는 3개의 테이블들에 S3에 복사된 CSV파일들의 데이터들을 벌크 업데이트 합니다.

 

5. 이 때 주의할 점은 Redshift가 CSV파일이 담긴 S3버킷에 접근할 수 있도록 권한을 세팅하고 부여해줘야 합니다. 이때 IAM을 사용할 것입니다.

 

 

바로 이전 시간에 5번을 그리고 이번 시간에 2번과 3번을 진행했습니다.

 

이제 1번, 4번을 구글 Colab을 이용해 실습하겠습니다.

 

 

 

 

 

 

 

 

 

COPY 명령으로 테이블 만들기

 

raw_data.user_session_channel

 

%%sql

CREATE TABLE raw_data.user_session_channel (
  userid integer,
  sessionid varchar(32) primary key,
  channel varchar(32)
);

 

 

%%sql

COPY raw_data.user_session_channel
FROM 's3://devjon-test-bucket/test_data/user_session_channel.csv'
credentials 'aws_iam_role=(Redshift의 ARN)'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

 

 

%%sql

SELECT * FROM raw_data.user_session_channel LIMIT 10;

 

 

 

 

 

 

raw_data.session_timestamp 생성

 

%%sql

CREATE TABLE raw_data.session_timestamp (
  sessionid varchar(32) primary key,
  ts timestamp
)

 

 

%%sql

COPY raw_data.session_timestamp
FROM 's3://devjon-test-bucket/test_data/session_timestamp.csv'
credentials 'aws_iam_role=(Redshift의 ARN)'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

 

 

 

%%sql

SELECT * FROM raw_data.session_timestamp LIMIT 10;

 

 

 

 

 

 

 

raw_data.session_transaction 생성

 

%%sql

CREATE TABLE raw_data.session_transaction (
  sessionid varchar(32) primary key,
  refunded boolean,
  amount int
)

 

 

%%sql

COPY raw_data.session_transaction
FROM 's3://devjon-test-bucket/test_data/session_transaction.csv'
credentials 'aws_iam_role=(Redshift의 ARN)'
delimiter ',' dateformat 'auto' timeformat 'auto' IGNOREHEADER 1 removequotes;

 

 

%%sql

SELECT * FROM raw_data.session_transaction LIMIT 10;