一、什么时候需要用户自定义函数呢?和其他语言一样,当你希望简化程序结构或者需要重用程序代码时,函数就是你的不二选择。Pig的用户自定义函数可以用Java编写,也可以用Python或Javascript编写。下面我们以Java为例进行介绍。
1、利用IDEA创建maven项目,并在Pom.xml中添加依赖如下
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>2.7.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
2、实现自定义函数
(1)自定义的运算函数:根据员工的薪水,判断薪水的级别,需要继承EvalFunc类。
package pig;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
//根据员工的薪水,判断薪水的级别
//调用 emp2 = foreach emp generate empno,ename,sal,运算函数(sal)
// emp2 = foreach emp generate
empno,ename,sal,pig.CheckSalaryGrade(sal);
public class CheckSalaryGrade extends
EvalFunc<String>{
@Override
public String
exec(Tuple tuple) throws IOException {
// 调用运行函数
//tuple传递的参数值
int sal = (Integer) tuple.get(0);
if(sal <1000) return "Grade A";
else if(sal>=1000 && sal<3000)
return "Grade B";
else return "Grade C";
}
}
(2)自定义的过滤函数:查询薪水大于2000的员工,需要继承FilterFunc类。
package pig;
import java.io.IOException;
import org.apache.pig.FilterFunc;
import org.apache.pig.data.Tuple;
//查询薪水大于2000的员工
//调用
emp3 = filter emp by 过滤函数(sal)
// emp3 = filter
emp by pig.IsSalaryTooHigh(sal);
public class IsSalaryTooHigh extends FilterFunc {
@Override
public Boolean
exec(Tuple tuple) throws IOException {
//取出薪水
int sal = (Integer) tuple.get(0);
return sal>2000?true:false;
}
}
3、打包并上传至虚拟机中
打包:mvn clean package
二、在Pig中注册并使用自定函数
1、在Pig中注册生成的jar包
register ~/pig-xxxx.jar
2、在Pig中利用自定义函数进行查询
emp2 = foreach
emp generate empno,ename,sal,pig.CheckSalaryGrade(sal);
dump emp2;
sal2 = filter
emp by pig.IsSalaryTooHigh(sal);
dump sal2 ;