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)
pig使用入门3-UDF的使用,布布扣,bubuko.com