2012년 2월 22일 수요일

Pig UDFs


lzo 파일을 pig에서 사용해야 해서 UDF를 만들어 봤다. 
 -  hadoop에 lzo 설정하기 
 


이전까지 많은 작업들이 약간은(?) 복잡한 알고리즘이 필요한 작업들이라서 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로도 정리  





댓글 없음:

댓글 쓰기