피그 (Pig)
개요
피그란?
- http://pig.apache.org/
- 피그는 대용량 데이터셋을 좀 더 고차원적으로 처리할 수 있게 해주는 스크립트 언어이다.
- 대규모 데이터셋을 좀 더 쉽게 분석하려고 야후의 연구원과 엔지니어들이 만들었다.
- 하나의 피그라틴 프로그램은 입력 데이터에 적용되어서 출력을 생성하는 일련의 연산 또는 변환으로 구성되어 있다.
- 연산은 데이터의 흐름을 설명한다.
- 피그 실행환경은 이를 실행가능한 표현으로 번역하여 수행한다.
피그의 장단점
맵리듀스의 단점
- 개발 주기가 매우 길다.
- 매퍼와 리듀서를 작성해서 컴파일 및 코드 패키징, 잡을 실행하고 결과까지 확인하려면 시간이 오래걸린다.
피그의 장점
- 콘솔화면에서 간단하게 6중 정도의 피그 라틴 코드를 작성해서 수테라바이트의 데이터를 처리 할 수 있다.
- 개발자가 작성한 프로그램의 데이터 구조를 자세히 검토할 수 있는 여러 명령어를 제공해 쿼리 요청을 작성하기가 편리하다.
- 입력 데이터의 대표 부분 집합에 대한 표본실행하는 기능도 제공하므로, 전체 데이터셋에 대해 진행하기 전에 수행 오류에 대한 점검이 가능하다.
- 피그에는 맵리듀스에서는 찾아볼 수 없는 조인이 포함되어 있다.
- 피그는 확장 할 수 있도록 설계되어 있다.
- 로딩,저장,필터링,그룹핑,정렬,조인은 사용자 정의 함수에 의해 자용자가 원하는대로 변경될 수 있다.
피그의 단점
- 대용량 데이터셋의 매우 작은 양에 대해서 쿼리하면, 전체 데이터셋 또는 이중 많은 부분에 대해 적용하려 하므로 잘 동작하지 않을 수 있다.
- 경우에 따라 피그가 맵리듀스보다 좋은 성능을 내지 못할 수 있다.
1. 피그의 설치 및 실행
설치
- 다운로드 후 압축만 해제 하면 됨
- jdk 1.6 이상이 설치되어 있어야 한다.
- 특정 하둡버전에 대해서만 동작.
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 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);
-- 기온값이 누락되었거나 비적합한 값을 가지는 레코드 제거
-- 변경 전
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)
데이터 결합 및 분리
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;
파라미터 대체
- 정기적으로 실행하는 피그 스크립트가 있다면 다른 파라미터를 줘서 같은 스크립트를 실행할 가능성이 매우 높다.
- 파라미터는 $문자를 접두어로 하여 식별자에 의해서 표시된다.
- 아래 예의 $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옵션과 함께 실행하면 전처리기의 대체동작을 확인 할 수 있다.
- 실제 실행은 하지 않는다.