Greenplum에서 데이터를 로드하고 언로드하는 주요 방법들을 살펴보겠습니다.
- INSERT
- COPY
- 외부 테이블
- gpload
이번 예제에서는 member_change 테이블을 사용하여 각 방법을 설명합니다.
CREATE TABLE public.member_change (
member_id VARCHAR(64),
phone_number VARCHAR(64),
action CHAR(1),
insert_date DATE
) WITH (APPENDONLY=TRUE, COMPRESSLEVEL=5)
DISTRIBUTED BY (member_id);
1. INSERT
INSERT INTO public.member_change VALUES('mem006', '13100000006', 'I', DATE '2011-12-03');
INSERT INTO public.member_change VALUES('mem002', '13100000002', 'D', DATE '2011-12-03');
INSERT INTO public.member_change VALUES('mem003', '13100000003', 'U', DATE '2011-12-03');
2. COPY
-- 데이터 로드
COPY public.member_change FROM '/home/gpadmin/member_history_init.dat' WITH DELIMITER ','
LOG ERRORS INTO error_member_change SEGMENT REJECT LIMIT 2 ROWS;
-- 데이터 언로드
COPY (SELECT * FROM member_change WHERE insert_date LIKE '2013%') TO '/data/export/tb_cp_02_2013.out';
member_history_init.dat 파일 내용:
mem001,13100000001,2011-12-01,3000-12-31,C,I,2011-12-01
mem002,13100000002,2011-12-01,3000-12-31,C,I,2011-12-01
mem003,13100000003,2011-12-01,3000-12-31,C,I,2011-12-01
mem004,13100000004,2011-12-01,3000-12-31,C,I,2011-12-01
mem005,13100000005,2011-12-01,3000-12-31,C,I,2011-12-01
3. 외부 테이블
외부 테이블은 Greenplum의 세그먼트 인스턴스 리소스를 활용하여 병렬적으로 데이터를 로드하거나 언로드할 수 있습니다.
- 읽기 전용 외부 테이블: 데이터 로드용, 수정 불가능
- 쓰기 가능한 외부 테이블: 데이터 언로드용, 테이블에서 레코드 선택 후 파일이나 명령 파이프라인 등에 출력
3.1 프로토콜 종류
- gpfdist: gzip 또는 bzip2 압축 지원, 파일 패턴 매칭 가능
- gpfdists: gpfdist의 보안 버전
- file: 외부 파일이 세그먼트 호스트에 위치해야 함
- gphdfs: HDFS에서 파일을 병렬로 읽음
3.2 gpfdist 사용법
(1) gpfdist 시작:
nohup gpfdist -d /var/load_files -p 8081 -l /home/gpadmin/log &
ps -ef | grep gpfdist
wget http://gpfdist_hostname:port/filename
(2) 데이터 쓰기를 위한 외부 테이블 생성:
CREATE EXTERNAL TABLE ext_tb_gf01(id INT, name TEXT)
LOCATION (
'gpfdist://mdw:8081/*.txt',
'gpfdist://mdw:8082/*.txt'
)
FORMAT 'TEXT' (DELIMITER '|' NULL '')
LOG ERRORS INTO err_customer SEGMENT REJECT LIMIT 2;
(3) 데이터 읽기를 위한 쓰기 가능한 외부 테이블 생성:
CREATE WRITABLE EXTERNAL TABLE ext_tb_gf04 (LIKE tb_cp_02)
LOCATION ('gpfdist://mdw:8081/tb_cp_02.out')
FORMAT 'TEXT' (DELIMITER '|' NULL ' ')
DISTRIBUTED BY (id);
INSERT INTO ext_tb_gf04 SELECT * FROM tb_cp_02;
(4) OS 명령형 웹 외부 테이블 정의:
DROP EXTERNAL TABLE IF EXISTS public.ext_tb_wb01;
CREATE EXTERNAL WEB TABLE ext_tb_wb01(output TEXT)
EXECUTE 'hostname'
FORMAT 'TEXT';
(5) URL 형 웹 외부 테이블 정의:
CREATE EXTERNAL WEB TABLE ext_tb_wb02 (name TEXT, date DATE, amount FLOAT4, category TEXT, description TEXT)
LOCATION (
'http://intranet.company.com/expenses/marketing/file.csv',
'http://intranet.company.com/expenses/eng/file.csv')
FORMAT 'CSV' (HEADER);
4. gpload
gpload은 외부 테이블을 사용한 데이터 로딩 과정을 간편하게 관리할 수 있는 도구입니다. 먼저 gpload 제어 파일인 gpload.yml을 작성합니다.
---
VERSION: 1.0.0.1
DATABASE: test
USER: gpadmin
HOST: localhost
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- master
PORT: 8888
FILE:
- /home/gpadmin/data/member_change.dat
- COLUMNS:
- member_id: VARCHAR(64)
- phone_number: VARCHAR(20)
- action: CHAR(1)
- insert_date: DATE
- FORMAT: text
- DELIMITER: ','
- ERROR_LIMIT: 2
- ERROR_TABLE: public.member_err
OUTPUT:
- TABLE: public.member_change
- MODE: INSERT
SQL:
- BEFORE: "TRUNCATE TABLE public.member_change"
- AFTER: "ANALYZE public.member_change"
gpload 실행 결과:
gpload -f gpload.yml
2018-05-18 20:53:10|INFO|gpload 세션 시작 2018-05-18 20:53:10
2018-05-18 20:53:10|INFO|gpfdist 시작 -p 8888 -P 8889 -f "/home/gpadmin/data/member_change.dat" -t 30
2018-05-18 20:53:11|INFO|실행 시간: 0.85 초
2018-05-18 20:53:11|INFO|삽입된 행 수 = 1
2018-05-18 20:53:11|INFO|업데이트된 행 수 = 0
2018-05-18 20:53:11|INFO|데이터 포맷팅 오류 = 0
2018-05-18 20:53:11|INFO|gpload 성공