피그 (Pig)

개요

피그란?

  • http://pig.apache.org/
  • 피그는 대용량 데이터셋을 좀 더 고차원적으로 처리할 수 있게 해주는 스크립트 언어이다.
  • 대규모 데이터셋을 좀 더 쉽게 분석하려고 야후의 연구원과 엔지니어들이 만들었다.
  • 피그는 두 부분으로 이루어져있다.
    • 피그 라틴 : 데이터의 흐름을 표현하기 위해 사용하는 언어(http://wiki.apache.org/pig/PigLatin)
    • 피그 라틴을 수행하는 실행 환경. 현재 단일 JVM에서의 로컬 실행 환경과 하둡 클러스터 상의 분산 실행 환경을 제공한다.
  • 하나의 피그라틴 프로그램은 입력 데이터에 적용되어서 출력을 생성하는 일련의 연산 또는 변환으로 구성되어 있다.
    • 연산은 데이터의 흐름을 설명한다.
    • 피그 실행환경은 이를 실행가능한 표현으로 번역하여 수행한다.

피그의 장단점

맵리듀스의 단점
  • 개발 주기가 매우 길다.
  • 매퍼와 리듀서를 작성해서 컴파일 및 코드 패키징, 잡을 실행하고 결과까지 확인하려면 시간이 오래걸린다.
피그의 장점
  • 콘솔화면에서 간단하게 6중 정도의 피그 라틴 코드를 작성해서 수테라바이트의 데이터를 처리 할 수 있다.
  • 개발자가 작성한 프로그램의 데이터 구조를 자세히 검토할 수 있는 여러 명령어를 제공해 쿼리 요청을 작성하기가 편리하다.
  • 입력 데이터의 대표 부분 집합에 대한 표본실행하는 기능도 제공하므로, 전체 데이터셋에 대해 진행하기 전에 수행 오류에 대한 점검이 가능하다.
  • 피그에는 맵리듀스에서는 찾아볼 수 없는 조인이 포함되어 있다.
  • 피그는 확장 할 수 있도록 설계되어 있다.
    • 로딩,저장,필터링,그룹핑,정렬,조인은 사용자 정의 함수에 의해 자용자가 원하는대로 변경될 수 있다.
피그의 단점
  • 대용량 데이터셋의 매우 작은 양에 대해서 쿼리하면, 전체 데이터셋 또는 이중 많은 부분에 대해 적용하려 하므로 잘 동작하지 않을 수 있다.
  • 경우에 따라 피그가 맵리듀스보다 좋은 성능을 내지 못할 수 있다.

1. 피그의 설치 및 실행

설치



export HADOOP_INSTALL=/home/gurubee/cloud/env/hadoop-1.0.3

PATH=$PATH:$HOME/bin:$HADOOP_INSTALL/bin
export PATH
export PIG_CLASSPATH=$HADOOP_INSTALL/conf


실행유형

로컬 모드
  • 단일 JVM 환경에서 수행된다.
  • 작은 데이터셋에 대해서 피그를 테스트해보기 위한 용도로만 적합하다.
  • 아래와 같이 실행하면 피그의 대화식 명령어 처리기인 그런트(Grunt)가 실행된다.

pig -x local

2012-06-15 19:08:33,516 [main] INFO  org.apache.pig.Main - Apache Pig version 0.10.0 (r1328203) compiled Apr 19 2012, 22:54:12
2012-06-15 19:08:33,517 [main] INFO  org.apache.pig.Main - Logging error messages to: /cloud/env/pig-0.10.0/bin/pig_1339754913505.log
2012-06-15 19:08:33,742 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
grunt> 

맵리듀스 모드
  • 쿼리 요청을 맵리듀스 작업으로 번역하여 하둡 클러스터에서 실행한다.
  • 하둡과 피그의 버전이 상호 호환이 되어야 한다.
    • 피그는 특정 하둡 버전에 대해서만 동작한다.
  • 환경설정 수정

export PIG_CLASSPATH=$HADOOP_INSTALL/conf

  • 맵리듀스 모드실행

/cloud/env/pig-0.10.0/bin/pig

2012-06-15 19:14:18,261 [main] INFO  org.apache.pig.Main - Apache Pig version 0.10.0 (r1328203) compiled Apr 19 2012, 22:54:12
2012-06-15 19:14:18,262 [main] INFO  org.apache.pig.Main - Logging error messages to: /cloud/env/pig-0.10.0/bin/pig_1339755258253.log
2012-06-15 19:14:18,620 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
2012-06-15 19:14:18,830 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: localhost:9001
grunt> 


피그 프로그램 실행

  • 실행하는 방법은 세 가지이다.
  • 스크립트
    • 피그 명령어가 포함된 스크립트 파일을 실행한다.
  • 그런트
    • 피그 명령어를 실행하는 대화형 쉘이다.
    • run과 exec를 사용해서 그런트 내에서 피그 스크립트를 실행하는 것도 가능하다.
  • 내장형

그런트

  • 라인편집 기능(Ctrl+e, Ctrl+p, Ctrl+n..)과 자동완성 기능 제공
  • help 명령으로 명령어 목록 조회 가능
  • quit 명령으로 종료

피그 라틴 편집기

  • PigPen: 피그 프로그램 개발을 지원해 주는 이클립스 플러그인이다.
  • Vim, TextMate : 피그 라틴용 문법 강조기

2. 예제

예제 생성

  • 2장의 연중 가장 높은 기온을 계산하는 프로그램 예제
  • sample.txt 내용
  
1999    10  1
1999    11  2
1999    12  3
2000    20  4
2000    11  5
 
  • 피그라틴 예

-- 로컬 모드 시작 
 ./bin/pig -x local
 
-- max_temp.pig: 피그라틴 작성 및 실행
-- 단순히 탭으로 구분된 텍스트이고, 각 라인은 연도, 기온, 특징 항목만으로 기록된 데이터로 간주
records = LOAD 'sample/sample.txt'
  AS (year:chararray, temperature:int, quality:int);
  
--  기온값이 누락되었거나 비적합한 값을 가지는 레코드 제거
filtered_records = FILTER records BY temperature != 9999 AND
  (quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9);

-- GROUP 함수를 이용하여 year 항목에 따라 관계를 정렬
grouped_records = GROUP filtered_records BY year;

-- FOREACH 모든행을 처리하여 파생된 행의 집합을 생성
-- GENERATE절을 사용하여 각각 파생된 행의 항목을 정의
max_temp = FOREACH grouped_records GENERATE group,
  MAX(filtered_records.temperature);
DUMP max_temp;

-- 실행 결과
Input(s):
Successfully read records from: "file:///home/gurubee/cloud/env/pig-0.10.0/sample/sample.txt"

Output(s):
Successfully stored records in: "file:/tmp/temp-15271195/tmp1542620103"

-- 필터의 영향으로 1999년도는 10도가, 2000년도는 20도가 가장 큰 온도로 조회 되었다.
(1999,10)
(2000,20)

 
  • DUMP 연산자를 사용하여 별칭에 해당하는 내용을 확인 할 수 있다.

grunt>DUMP records;
... 
어쩌구 저쩌구.. 블라블라..
...

(1999,10,1)
(1999,11,2)
(1999,12,3)
(2000,20,4)
(2000,11,5)
 
  • DESCRIBE 연산자를 사용하여 관계 구조(스키마)를 학인 할 수 있다.

grunt> DESCRIBE records
records: {year: chararray,temperature: int,quality: int}
  
  • ILLUSTRATE 연산자를 통해서 간결하면서도 완전한 데이터 셋을 생성 할 수도 있다.

grunt> ILLUSTRATE max_temp
... 
어쩌구 저쩌구 
...

----------------------------------------------------------------------------
| records     | year:chararray     | temperature:int     | quality:int     | 
----------------------------------------------------------------------------
|             | 1999               | 11                  | 2               | 
|             | 1999               | 10                  | 1               | 
|             | 2000               | 11                  | 5               | 
|             | 2000               | 20                  | 4               | 
|             | 1999               | 0                   | 0               | 
----------------------------------------------------------------------------
-------------------------------------------------------------------------------------
| filtered_records     | year:chararray     | temperature:int     | quality:int     | 
-------------------------------------------------------------------------------------
|                      | 1999               | 10                  | 1               | 
|                      | 2000               | 11                  | 5               | 
|                      | 2000               | 20                  | 4               | 
|                      | 1999               | 0                   | 0               | 
-------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
| grouped_records     | group:chararray     | filtered_records:bag{:tuple(year:chararray,temperature:int,quality:int)}                     | 
--------------------------------------------------------------------------------------------------------------------------------------------
|                     | 1999                | {(1999, 10, 1), (1999, 0, 0)}                                                                | 
|                     | 2000                | {(2000, 11, 5), (2000, 20, 4)}                                                               | 
--------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------
| max_temp     | group:chararray     | :int     | 
-------------------------------------------------
|              | 1999                | 10       | 
|              | 2000                | 20       | 
-------------------------------------------------
 

3. 데이터베이스와 비교

  • 실제로 보니 피그라틴이 SQL과 비슷하게 보일 수 있다.
    • GROUP BY나 DESCRIBE와 같은 연산자들이 있어 더 강하게 느껴진다.
피그 라틴SQL
데이터 흐름 프로그래밍 언어서술형 프로그래밍 언어
각 단계가 하나의 변환으로 구성된 입력관계에 대한 단계적 연산의 집합함게 결합되어 출력이 정의되는 제약 조건의 집합
실행시 선택적으로 스키마를 정의미리 정의된 스카마로 이루어진 테이블에 데이터 저장
피그는 없다트랜잭션, 인덱스 제공

4. 피그 라틴

구조

  • 문장이 모여서 이루어져있다.
    • 예로 GROUP 연산은 일종의 문장이다.
  • 문장들은 세미콜론으로 끝난다.
    • GROUP filtered_records BY year;
  • 주석
    • 한줄 주석 : -- (이중 하이폰)
    • 여러줄 주석 : /* */
  • 연산자 (LOAD, ILLUSTRATE), 명령어(cat, ls), 표현식 (matches, FLATTEN), 함수는(DIFF, MAX). 식별자로 사용할 수 없다
  • 대소문자 구분 복합적인 규칙이 있다.
    • 연산자 및 명령어들은 대소문자를 구분하지 않는다.
    • 별칭 및 함수 이름은 대소문자를 구분한다.

문장

  • 각 문장은 하나씩 해석된다. (논리 계획)
  • 문법 오류 등과 같은 문제가 발생하면 해석은 중지된다.
  • DUMP 문장 실행시 논리 계획을 물리 계획으로 번역 하여 실행한다.
  • 피그가 만드는 물리 계획은 연속적인 맵리듀스 잡들이다.
    • 로컬 JVM에서 실행되고, 맵리듀스 모드에서는 하둡 클러스터에서 실행된다.
  • 연산자 및 명령어 참고 (Page 435 ~ 437)

표현

  • 평가되어 값을 산출하는 것을 말한다 (P438)
  • 관계형 연산자를 포함하는 문장 일부로서 사용될 수 있다.
  • Page 439 참고

타입

  • int, long, float, double 네 개의 숫자 타입이 있다.
  • blob 이진 데이터를 다루기 위한 bytearray타입이 있다.
  • UTF-8로 읽고 저장할 수 있지만, UTF-16으로 표현하는 java.lang.String 타입과 같은 chararray 타입이 있다.
  • boolean, short, byte, char 타입은 없다. 이런 타입은 int 또는 chararray를 이용해 표현한다.
  • Page 440 참고

스키마

  • 읽은 데이터의 타입을 결정하기 위해 스키마를 사용한다.
  • AS( ... )에서 지정할 수 있다.
    • 위 예제에서 AS (year:chararray, temperature:int, quality:int);
  • 스키마를 지정하지 않으면 위치표기법($0, $1..)만 사용 가능
  • 스카마를 지정하지 않으면 아래 검증 방법도 사용 할 수 없다.
검증 및 null 값
  • 스키마에서 선언한 대로 값이 변환되지 않으면 null 갑으로 대체된다.
  • 피그는 무료한 항목에 대해서 경고 메세지를 생성하지만 처리를 중단시키지 않는다.
  • is null 연산자 관련 예제들 (Page 444)
  • 손상된 레코드가 몇 개인지 알 수 있다.

-- 손상된 레코드 조회
grunt> corrupt_records = FILTER records BY temperature is null;
grunt> DUMP corrupt_records;

-- 손상된 레코드가 몇 개인지 알 수 있다. 
grunt> grouped = GROUP corrupt_records ALL;
grunt> all_grouped = FOREACH grouped GENERATE group, COUNT(corrupt_records);
grunt> DUMP all_grouped;
(all,1L)
 
  • SPLIT 연산자를 사용하여 'good'과 'bad'관계로 구분 할 수 있다.

grunt> SPLIT records INTO good_records IF temperature is not null,
>> bad_records IF temperature is null;

-- good
grunt> DUMP good_records;
(1950,0,1)
(1950,22,1)
(1949,111,1)
(1949,78,1)

-- bad
grunt> DUMP bad_records;
(1950,,1)
 

함수

  • 피그에는 다섯 종류의 함수가 있다.
  • 평가 함수
    • 하나 이상의 수식을 입력 받아 또 다른 수식을 반환
    • AVG, CONCAT, COUNT, DIFF, MAX, MIN, SIZE, SUM..
  • 필터 함수
    • 평가 함수와 같지만 boolean을 반환
    • IsEmpty
  • 로드 함수
    • 외부 저장 장치로부터 데이터를 어떻게 읽을지 지정한다. (P447)
  • 저장 함수
    • 외부 저장 장치에 관계를 어떻게 기록할지 지정한다. (P447)
  • 사용자 정의 함수
    • 필요한 함수가 없다면 스스로 작성 할 수 있다.

5. 사용자 정의 함수

필터 UDF

필터 UDF 자바 구현
  • 하나 이상의 수식을 입력 받아 boolean을 반환
  • org.apache.pig.FilterFunc를 상속하여 구현
  • IsGoodQuality.java, IsGoodQualityTest.java
 
 package com.gurubee.pig.udf.filter;

import java.io.IOException;

import org.apache.pig.FilterFunc;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.Tuple;

/**
 * 만족스럽지 못한 온도 특징을 나타내는 레코드를 삭제하는 FilterFunc UDF 함수
 * 
 * @author : oramaster
 * 
 */
public class IsGoodQuality extends FilterFunc {

    @Override
    public Boolean exec(Tuple tuple) throws IOException {
        if (tuple == null || tuple.size() == 0) {
            return false;
        }

        try {
            Object object = tuple.get(0);
            if (object == null) {
                return false;
            }
            int i = (Integer) object;
            return i == 0 || i == 1 || i == 4 || i == 5 || i == 9;
        } catch (ExecException e) {
            throw new IOException(e);
        }
    }
}

필터 UDF 사용방법
  • 새로운 함수를 사용하기 위해서는 jar 파일로 패키지를 생성해야 한다.
  • REGISTER 연산자를 사용하여 피그에게 jar 파일에 대해 알려준다.

grunt> REGISTER pig.jar;
grunt> filtered_records = FILTER records BY temperature != 9999 AND
>> com.gurubee.pig.udf.filter.IsGoodQuality(quality);

  • 사용 예제

-- udf-sample.txt 내용
2000	11	6
1999	12	7
2000	18	8
1999	8	9
2000	10	9

-- 로컬 모드 시작 
 ./bin/pig -x local
 
--  cloud-project.jar 등록
REGISTER cloud-project.jar;

-- 피그라틴 작성
records = LOAD 'sample/udf-sample.txt'
  AS (year:chararray, temperature:int, quality:int);
  
-- 사용자 함수 com.gurubee.pig.udf.filter.IsGoodQuality 적용 
filtered_records = FILTER records BY temperature != 9999 AND
  com.gurubee.pig.udf.filter.IsGoodQuality(quality);

grouped_records = GROUP filtered_records BY year;

max_temp = FOREACH grouped_records GENERATE group,
  MAX(filtered_records.temperature);
DUMP max_temp;

-- 처리결과
-- 1999년도에는 8도가, 2000년도에는 10도가 가장 큰 온도로 조회 되었다.
(1999,8)
(2000,10)

  • DEFINE 연산자를 이용하여 함수 이름을 짧게 할 수 있다.

grunt> DEFINE isGood com.gurubee.pig.udf.filter.IsGoodQuality();
grunt> filtered_records = FILTER records BY temperature != 9999 AND isGood(quality);

  • UDF 사용 후 아래와 같이 변경되었다.

--  기온값이 누락되었거나 비적합한 값을 가지는 레코드 제거
-- 변경 전
filtered_records = FILTER records BY temperature != 9999 AND
  (quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9);

--  변경후  
filtered_records = FILTER records BY temperature != 9999 AND isGood(quality);

평가 UDF

  • 하나 이상의 수식을 입력 받아 또 다른 수식을 반환
  • java.lang.String의 trim()역할을 하는 UDF 함수를 만드는 예
  • org.apache.pig.EvalFunc 클래스를 상속하여 구현한다.

package com.gurubee.pig.udf.eval;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.pig.EvalFunc;
import org.apache.pig.FuncSpec;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;

/**
 * chararray 값들의 맨 앞과 맨 뒤의 불필요한 공백을 없애는 EvalFunc UDF
 * 
 * @author : oramaster
 * 
 */
public class Trim extends EvalFunc<String> {

    @Override
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0) {
            return null;
        }
        try {
            Object object = input.get(0);
            if (object == null) {
                return null;
            }
            return ((String) object).trim();
        } catch (ExecException e) {
            throw new IOException(e);
        }
    }

    /**
     * Page 451 타입의 활용 참고
     */
    @Override
    public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
        List<FuncSpec> funcList = new ArrayList<FuncSpec>();
        funcList.add(new FuncSpec(this.getClass().getName(), new Schema(
                new Schema.FieldSchema(null, DataType.CHARARRAY))));

        return funcList;
    }
}

로드 UDF

  • 외부 저장 장치로부터 데이터를 어떻게 읽을지 지정
  • Unix의 cut 명렁어처럼 일반 텍스트 열 범위를 항목으로 읽어 들이는 예
  • org.apache.pig.LoadFunc 클래스를 상속하여 구현한다.
  • 생략

6. 데이터 처리 연산자

데이터 로드 및 저장

  • PigStorage를 사용해서 튜플을 콜론 문자로 구분되는 일반 텍스트 값으로 저장할 수 있다.

 grunt> records = LOAD 'sample/sample.txt'
>>   AS (year:chararray, temperature:int, quality:int);
grunt> STORE records INTO 'out' USING PigStorage(':');

grunt> cat out
1999:10:1
1999:11:2
1999:12:3
2000:20:4
2000:11:5

데이터 필터링

FOREACH .. GENERATE
  • 관계의 모든 행에 작동하기 위해 사용한다.
  • Constant라는 chararray 값을 가지는 상수 항목으로 처리
 
grunt> DUMP records
... 
어쩌구 저쩌구 
...
(1999,10,1)
(1999,11,2)
(1999,12,3)
(2000,20,4)
(2000,11,5)

-- 첫번째 항목($0)은 그대로 출력,
-- 두번째 항목은 세번째항목($2)+1 값을 출력
-- 세번째 항목은 Constant로 고정출력
grunt> B = FOREACH records GENERATE $0, $2+1, 'Constant';
grunt> DUMP B;
(1999,2,Constant)
(1999,3,Constant)
(1999,4,Constant)
(2000,5,Constant)
(2000,6,Constant)

STREAM
  • 한 관계의 데이터를 외부 프로그램 또는 스크립트를 사용해서 변환 할 수 있도록 해준다.
  • 피그에서 리눅스 명령어 및 shell 프로그램 사용을 가능하게 해준다.
  • 리눅스의 cut 명력을 사용하여 두 번째 항목 온도만 출력하는 예이다.

grunt> C = STREAM records THROUGH `cut -f 2`;
grunt> DUMP C;

-- 처리결과
(10)
(11)
(12)
(20)
(11)

데이터 분류 및 조인

조인(JOIN)
  • 내부 조인 예

grunt> DUMP A;
(2,Tie)
(4,Coat)
(3,Hat)
(1,Scarf)

grunt> DUMP B;
(Joe,2)
(Hank,4)
(Ali,0)
(Eve,3)
(Hank,2)

-- 조인작업 (조인키를 지정한다. A BY $0, B BY $1) 
-- A의 첫번째 열과 B의 두번째 열의 값이 같은 값만 조인한다. 
grunt> C = JOIN A BY $0, B BY $1;
grunt> DUMP C;
(2,Tie,Joe,2)
(2,Tie,Hank,2)
(3,Hat,Eve,3)
(4,Coat,Hank,4)


공통그룹(COGROUP)
  • COGROUP은 JOIN과 비슷하지만 출력 튜플의 중첩된 집합을 생성한다.
  • COGROUP은 유일한 집단화 키에 대한 튜플을 생성한다.

grunt> D = COGROUP A BY $0, B BY $1;
grunt> DUMP D;
(0,{},{(Ali,0)})
(1,{(1,Scarf)},{})
(2,{(2,Tie)},{(Joe,2),(Hank,2)})
(3,{(3,Hat)},{(Eve,3)})
(4,{(4,Coat)},{(Hank,4)})

교차(CROSS)
  • CROSS JOIN (Catesian Product)

grunt> I = CROSS A, B;
grunt> DUMP I;
(2,Tie,Joe,2)
(2,Tie,Hank,4)
(2,Tie,Ali,0)
(2,Tie,Eve,3)
(2,Tie,Hank,2)
(4,Coat,Joe,2)
(4,Coat,Hank,4)
(4,Coat,Ali,0)
(4,Coat,Eve,3)
(4,Coat,Hank,2)
(3,Hat,Joe,2)
(3,Hat,Hank,4)
(3,Hat,Ali,0)
(3,Hat,Eve,3)
(3,Hat,Hank,2)
(1,Scarf,Joe,2)
(1,Scarf,Hank,4)
(1,Scarf,Ali,0)
(1,Scarf,Eve,3)
(1,Scarf,Hank,2)

분류(GROUP)
  • COGROUP은 두 개 이상의 관계로 데이터를 분류하지만, 단일 관계로 데이터를 분류한다.

grunt> C = GROUP A ALL;
grunt> DUMP C;
(all,{(Joe,cherry),(Ali,apple),(Joe,banana),(Eve,apple)})

데이터 정렬

  • 피그에서 관계들은 정렬되지 않은 상태로 있다.
  • ORDER 연산자를 사용하여 관계의 한 개 이상의 항목을 정렬할 수 있다.
  • LIMIT 연산자를 사용하여 개수를 제한 할 수 있다.

grunt> B = ORDER A BY $0, $1 DESC;
grunt> DUMP B;

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

grunt> D = LIMIT B 2;
grunt> DUMP D;
(1,2)
(2,4)


데이터 결합 및 분리

  • UNION을 사용하여 하나로 합칠 수 있다.

grunt> DUMP A;
(2,3)
(1,2)
(2,4)

grunt> DUMP B;
(z,x,8)
(w,y,1)

grunt> C = UNION A, B;
grunt> DUMP C;
(2,3)
(z,x,8)
(1,2)
(w,y,1)
(2,4)

7. 실전 피그 사용

병렬 처리

  • 하둡모드에서 실행 할 때 피그에 작업마다 몇 개의 리듀서를 실행할지 지정해 주어야 하나.
  • PARALLEL절을 사용하여 지정하면 된다.
  • 모든 분류 및 결합연사자(GROUP, COGROUP,JOIN, CROSS) 및 DISTINCT와 ORDER 등에 지정이 가능하다
  • 리듀서 개수 설정, 기본값은 1
  • GROUP 연산에 대해 리듀서 수를 30개로 설정

 grouped_records = GROUP records BY year PARALLEL 30;
 

파라미터 대체

  • 정기적으로 실행하는 피그 스크립트가 있다면 다른 파라미터를 줘서 같은 스크립트를 실행할 가능성이 매우 높다.
    • 예로 실행 일자(date)
  • 파라미터는 $문자를 접두어로 하여 식별자에 의해서 표시된다.
  • 아래 예의 $input, $output는 입력 및 출력 경로를 지정하기 위해서 사용한다.
  • 피그라틴 스크립트

-- max_temp_param.pig
records = LOAD '$input' AS (year:chararray, temperature:int, quality:int);

filtered_records = FILTER records BY temperature != 9999 AND
(quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9);

grouped_records = GROUP filtered_records BY year;

max_temp = FOREACH grouped_records GENERATE group,
MAX(filtered_records.temperature);

STORE max_temp into '$output';
 
  • 피그 실행시 -param옵션을 주어서 파라미터를 지정 할 수 있다.

 % pig \
        -param input=/user/tom/input/ncdc/micro-tab/sample.txt \
        -param output=/tmp/out \
        src/main/ch11/pig/max_temp_param.pig
 
  • 파일에 파라미터를 지정하고 -param_file 옵션을 주어서 피그를 실행하여 파라미터를 넘기는 방법도 있다.

-- max_temp_param.param 파링ㄹ
# Input file
input=/user/tom/input/ncdc/micro-tab/sample.txt

# Output file
output=/tmp/out

-- 피그실행
% pig \
-param_file src/main/ch11/pig/max_temp_param.param \
src/main/ch11/pig/max_temp_param.pig 
 
동적 파라미터
  • 유닉스 쉘의 백틱으로 둘러싸인 명령어데 대한 명령어 대체를 지원
  • 아래는 일자를 동적 파라미터로 사용하는 예이다.

% pig \
    -param input=/user/tom/input/ncdc/micro-tab/sample.txt \
    -param output=/tmp/`date "+%Y-%m-%d"`/out \
    src/main/ch11/pig/max_temp_param.pig
 
파라미터 대체 처리
  • 파라미터 대체는 스크립트를 실행하기 전에 전처리 단계에서 일어난다.
  • -dryrun옵션과 함께 실행하면 전처리기의 대체동작을 확인 할 수 있다.
  • 실제 실행은 하지 않는다.