1、Working with UDF(user defined function)
pig能够支持两种类型的UDFs:eval和load/store,
其中load/store的自定义函数主要是用来加载和保存特定的数据格式;
eval自定义函数主要用来进行常规的数据转换。
1.1 eval
如果想要实现自定义的eval类型的函数,编写一个类继承自EvalFunc<T>这个抽象类,重写这个类的抽象方法:
abstract public T exec(Tuple input) throws IOException;
该方法传入的类型是Tuple类型(pig类型之一)。
如果调用udf时使用的是:udf(ARG1, ARG2);那么调用input.get(0)将得到ARG1,同理input.get(1)得到的是ARG2,
input.getSize()得到传递的参数的数量,这里就是2.
1.2编写将字符串转换为大写的UDF
导个包pig.0.11..jar加入工作环境
1.3代码示例(注意:此时的包名为myudfs,pig注册UDF的时候,需要使用类的全名)
package myudfs;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.util.WrappedIOException;
public class UPPER extends EvalFunc<String>{
@Override
public String exec(Tuple input) throws IOException {
// TODO Auto-generated method stub
if(input == null || input.size() == 0){
return null;
}
try {
return ((String)input.get(0)).toUpperCase();
} catch (Exception e) {
// TODO: handle exception
throw WrappedIOException.wrap("Caught exception processing input row",e);
}
}
}
1.4打包命名为UPPER.jar放入pig目录lib文件夹下
1.5准备数据测试文件
student_data文件:
student1,1,1
studetn2,2,2
student3,3,3
student4,4,4
1.6将student_data文件上传hdfs上,hadoop dfs -put student_data /input
1.7执行pig
注册UDF
grunt> register lib/UPPER.jar 使用pwd查看当前工作目录,为pig
1.8加载数据
grunt> A = load 'student_data' using PigStorage(',') as (name:chararray, age:int,gpa:double);
grunt> B = FOREACH A GENERATE myudfs.UPPER(name); 注意类的全名
grunt> dump B;
这时将输出:
(STUDENT1)
(STUDETN2)
(STUDENT3)
(STUDENT4)