본문 바로가기
Biz/Data

Hortonworks Sandbox - Pig(피그)를 활용한 데이터 처리 - 2부

by 조병희 2013. 3. 26.

피그는 아파치 Hadoop 사용하는 높은 수준의 스크립트 언어이다. 데이터 흐름 같은 데이터 분석 문제를 설명하는데 유용하다. 또한 데이터 조작에 관련된 많은 일들을 할수 있다. 게다가 사용자정의함수(User Defined Functions(UDF) 사용할 있는데  이때 JRuby, 자이 썬과 자바 다양한 언어로 코드를 호출 있다. 피그 함수를 다른 언어에 넣을수도 있는데 이런 방식은​​실제 비즈니스 문제를 해결 크고 복잡한 어플리케이션을 구축 구성 요소로 피그를 사용할 있다는 것이다.

피그 응용 프로그램의 좋은 예는 프로세스가 소스에서 데이터를 추출하고 룰에 따라 변환하고 데이터 셋으로의 로드를  어떻게 처리하는지를 설명하는 ETL 트랜잭션 모델입니다. 피그는 파일, 스트림 또는 사용자 정의 함수 (UDF) 사용하여 다른 소스에서 데이터를 처리 ​​있다. 먼저 데이터의 선택, 반복 기타 변환을 수행 수있는 데이터를 가지고 UDF 기능으로 복잡한 알고리즘에 데이터를 전달하고 Hadoop 데이터 파일 시스템에 결과를 저장할 있다.

이번에는 야구 통계 파일을 사용한다. 매년 선수들의 최고 런을 계산할 것이다. 파일은 1871 년에서 2011 년에서 모든 통계 정보를 가지고 있으며, 그것은 90,000 이상의 레코드가 포함되어 있다.

http://seanlahman.com/files/database/lahman591-csv.zip

batting.csv master.csv File Browser 통해 입력한다.

 

(Office를 사용해서 글쓸려고했는데 오류가 나서 일일이 그림을 붙이자니 힘들다)

파일을 올렸으니 피그에서 처리를 해 본다.

기존의 테이블로 생성해서 올린 것과 다르게 피그에서 PigStorage 함수를 사용해서 직접 로드할 것이다. 구분자는 ','로 한다.

batting = load 'Batting.csv' using PigStorage(',');

파일을 로드했으니 각필드에 대한 이름을 정해준다. 여기에서는 FOREACH 구분을 사용할 것이다.

runs = FOREACH batting GENERATE $0 as playerID, $1 as year, $8 as runs;

GROUP 구문을 통해 년도 필드를 기준으로 runs 들을 그룹핑하고 이것을 grp_data로 저장한다.

grp_data = GROUP runs by (year);

각 년도의 최고 runs을 찾기 위해 다시 FOREACH를 수행한다.

max_runs = FOREACH grp_data GENERATE group as grp,MAX(runs.runs) as max_runs;

최고의 run을 가지고 있는 player id 를 찾기 위해 조인을 한다.

join_max_run = JOIN max_runs by ($0, max_runs), runs by (year,runs);

join_data = FOREACH join_max_run GENERATE $0 as year, $2 as playerID, $1 as runs;

dump join_data;

실행하면 다음과 같이 결과가 출력된다.

 

우리는 몇 가지 쉼표로 구분 된 데이터를 로드하여 간단한 피그 스크립트를 만들어 보았다. 레코드 셋으로부터 각 로우에서 player ID, year, runs 뽑아내었다. GROUP 구문으로 year별로 정렬하고 최대 runs을 찾았다. 그리고 해당되는 playerID를 매핑했다.

 2부는 여기서 끝.

 

댓글