[플레이데이터 빅데이터 부트캠프]Pig(1)

 

Pig는 빅데이터를 가공 및 저장하는 프로그램이다.

아래와 같이 실습을 통해 Pig를 설치하고 데이터 조작 및 저장을 해본다.

Pig 설치

홈 디렉토리 이동 후 Pig를 다운로드하고 압축해제한다.

cd ~/bigdata
wget https://downloads.apache.org/pig/pig0.17.0/pig-0.17.0.tar.gz

tar xvf pig-0.17.0.tar.gz

Pig 디렉토리 명 변경 후, 환경변수 설정하고, Pig를 실행한다.

mv pig-0.17.0 pig
ls

sudo gedit ~/.bashrc
...
source ~/.bashrc

Hortonoworks 창에서 pig를 치면 grunt창으로 뒤바뀐다.  quit를 치면 종료된다.

pig를 통한 데이터 조작 

sample_data.txt

John	18	4.25
Mary	19	3.52
Bill	20	3.95
Joe	18	2.34
 A = LOAD 'sample_data.txt' USING PigStorage() AS 
(name:chararray, age:int, gpa:float);
DUMP A;

여기서 chararray는 문자열이다. A를 변수라 하지 않고 릴레이션이라고 한다.

원하는 칼럼만 출력하고 싶을 때

X = FOREACH A GENERATE name,$2;
DUMP X;
(Johm, 4.25)
(Mary, 3.52)
(Bill, 3.95)
(Joe, 2.34)

Bag 자료구조

sample_data를 gedit으로 Bag 자료구조로 샘플 데이터를 수정해준다.

1	2	3
4	2	1
8	3	4
4	3	3

아래 코드에서 샘플 데이터를 Outer bag으로 만들었다.(기본 형태는 튜플과 다르지 않다.)

A = LOAD 'Sample_data' as (f1:int, f2:int, f3:int);
DUMP A;

(1, 2, 3)
(4, 2, 1)
(8, 3, 4)
(4, 3, 3)

그룹 연산자

A = LOAD 'sample_data' as (f1:int, f2:int, f3:int);
DUMP A;

X = GROUP A BY f1;
DUMP X;
(1,{(1, 2, 3)})
(4, {(4, 3, 3), (4, 2, 1)})
(8, {(8, 3, 4)})

f1의 기준으로 group으로 묶어주었다.(f1 속성값 4는 중복되었기 때문에 두개의 필드가 존재한다.)

위와 같은 형태를 Inner Bag이라고 한다.

산술 연산자

sampledata4.txt를 불러온다.

10	1
10	3
10	6
A = LOAD 'sampledata4' AS (f1:int, f2:int);
DUMP A;

f1과 f2를 나누기 연산하고, 나머지를 세번째 속성으로 지정하여 X 릴레이션에 저장 후 출력하였다.

X = FOREACH A GENERATE f1, f2, f1%f2;
DUMP X;

(10, 1, 0)
(10, 3, 1)
(10, 6, 4)

형 변환(Cast) 연산자

1	2	3
4	2	1
8	3	4
4	3	3
7	2	5
8	4	3
A = LOAD 'sample_data' AS (f1:int, f2:int);
B = GROUP A BY f1;
DUMP B;

(1,{(1, 2, 3)})
(4, {(4, 3, 3), (4, 2, 1)})
(7, {(7, 2, 5)})
(8, {(8, 4, 3), (8, 3, 4)})

X = FOREACH B GENERATE group, (chararray)COUNT(A) AS total;
DUMP X

(1,1)
(4,2)
(7,1)
(8,2)

그룹별로 그룹수를 세아려서 결과값을 도출하였다.

DESCRIBE B
B: {group: int,A: {(f1: int,f2: int,f3L int)}}

DESCRIBE X
X: {group: int,total: chararray}

DESCRIBE 함수를 사용하여, 형변환을 알아볼 수 있다.

Map 자료구조

아래와 같이 Sample_data를 수정한다.

[open#apache]
[apache#hadoop]
A = LOAD 'sample_data' AS (M:map []);

DESCRIBE A;
DUMP A;

A: {M: map[]}
([open#apache])
([apache#hadoop])

Map 자료 구조에서 # 기호는 키와 값을 구분짓는 기호를 뜻한다.