package org.openflamingo.mapreduce.core;
import org.apache.pig.PigServer;
import org.openflamingo.mapreduce.util.StringUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Apache Pig의 기능을 다른 MapReduce Driver와 같이 동작하도록 공통적인 기능을 정의한 Pig Driver.
*
* @author Edward KIM
* @author Seo Ji Hye
* @since 0.1
*/
public class PigDriver {
public static final String PARAM_JARS = "jars";
public static final String PARAM_INPUT = "input";
public static final String PARAM_OUTPUT = "output";
public static final String PARAM_STORAGE = "PigStorage(\"{}\")";
public static final String PARAM_DEFAULT_STORAGE = "PigStorage(',')";
public static final String PARAM_COLUMN = "{}:{}";
public static final String PQL_LOAD = "{} = LOAD {} USING {};";
public static final String PQL_LOAD_AS = "{} = LOAD {} USING {} AS ({});";
public static final String PQL_STORE = "STORE {} INTO {} USING {};";
public static final String PQL_DUMP = "DUMP {};";
public static final String[] RELATIONS = new String[]{
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z"
};
/**
* Key Value Style Parameter Map
*/
private Map<String, String> params = null;
/**
* Apache Pig Server
*/
private PigServer pigServer;
/**
* Default Constructore.
*
* @param args Command Line Arguments
*/
public PigDriver(String[] args, PigServer pigServer) throws IOException {
this.pigServer = pigServer;
this.params = parseArguements(args);
registExternalJar();
}
/**
* 공백으로 구분되어 있는 파라미터를 Key Value로 구성한다.
*
* @param args 커맨드라인 파라미터
* @return Key Value
*/
public static Map<String, String> parseArguements(String[] args) {
// TODO Commons-CLI
Map<String, String> params = new HashMap<String, String>();
for (int i = 0; i < args.length; ++i) {
params.put(args[i], args[++i]);
}
return params;
}
/**
* Key Value Style Parameter Map을 반환한다.
*
* @return Key Value Style Parameter Map
*/
public Map<String, String> getParams() {
return params;
}
/**
* External JAR 파일을 Pig에 등록한다.
*
* @throws java.io.IOException JAR 파일이 존재하지 않는 경우
*/
public void registExternalJar() throws IOException {
String[] strings = getCommaDelimitedParameter(PARAM_JARS);
if (strings != null) {
for (String path : strings) {
registExternalJar(pigServer, path);
}
}
}
/**
* External JAR 파일을 Pig에 등록한다.
*
* @param pigServer Pig Server
* @param jar JAR 파일 경로
* @throws java.io.IOException JAR 파일이 존재하지 않는 경우
*/
public void registExternalJar(PigServer pigServer, String jar) throws IOException {
pigServer.registerJar(jar);
}
/**
* 지정한 Key에 대한 파라미터를 배열로 반환한다.
*
* @param key 파라미터 Key
* @return 파라미터 Key에 대한 문자열 배열
*/
public String[] getCommaDelimitedParameter(String key) {
String commaDelimitedJars = params.get(key);
return StringUtils.commaDelimitedListToStringArray(commaDelimitedJars);
}
/**
* Pig Server를 반환한다.
*
* @return Pig Server
*/
public PigServer getPigServer() {
return pigServer;
}
}