이전까지 많은 작업들이 약간은(?) 복잡한 알고리즘이 필요한 작업들이라서 java 로 직접 데이터를 만졌었는데, 반복적인 작업들이 필요하게 되면서 pig로 작업을 하는게 편할것 같았다.
필요한 udf 또한 복잡하지 않고 너무도 간단한 수준이라서 udf에 대해서 자세한 내용은 모르지만 필요한 함수를 만들어 보았다. (elephant-bird 라고 트위터에서 오픈해 놓은 코드가 있는데, 사내에서 사용하기가 어려운 상황..)
jython을 이용한 udf는 만들기가 간단해서 활용도가 높을것 같다.
# Java UDFs - LzoPigStorage
package xxxxx;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.OutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.pig.builtin.PigStorage;
import com.hadoop.mapreduce.LzoTextInputFormat;
public class LzoPigStorage extends PigStorage {
private String delimiter = null;
public LzoPigStorage() {
super();
}
public LzoPigStorage(String delimiter) {
super(delimiter);
this.delimiter = delimiter;
}
@Override
public InputFormat<LongWritable, Text> getInputFormat() {
return new LzoTextInputFormat();
}
@Override
public OutputFormat getOutputFormat() {
return new TextOutputFormat();
}
}
// 사용
register 파일명.jar;
A = load 'data_path' using xxx.LzoPigStorage('\t') AS (.....);
# jython
// string_pig_udf.py
@outputSchema("rquery:chararray")
def rmQuerySpace(instr):
return instr.replace(' ','')
// 사용
register 'string_pig_udf.py' using jython as myfuncs;
...
C = FOREACH B GENERATE myfuncs.reQuerySpace(query);
# 간단히 wiki로도 정리
댓글 없음:
댓글 쓰기