首页 > 代码库 > pig使用入门3-UDF的使用

pig使用入门3-UDF的使用

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)