使用内置的函数无法完成分析任务,那么需要写自定义函数
show functions; //查看自带的所有的内置函数
desc function upper; //查看具体的某个函数的用法
desc function extended upper; //带有具体案例
##分三类
## UDF 一进一出 处理原文件内容某些字段包含 [] ""
## UDAF 多进一出 sum() avg() max() min()
## UDTF 一进多出 ip -> 国家 省 市
UDF函数的开发
** 必须继承UDF类
** 重写evaluate函数 支持重载
** 必须要有返回类型,可以返回null,但是返回类型不能为void
** 建议使用Text/LongWritable
## 1.创建一个maven项目
## 2.修改pom.xml文件
org.apache.hive
0.13.1
org.apache.hive
0.13.1
<
dependency
>
<
groupId
>
org.apache.hadoop
groupId
>
<
artifactId
>
hadoop-common
artifactId
>
<
version
>
2.5.0
version
>
dependency
>
## 3.替换repository
## 4.包含hive的依赖的jar的repository
## 代码实现(注意必须实现一个名为evaluate的方法)
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class SalaryUDF extends UDF{
public Text evaluate(Text salaryText){
Text text = new Text();
//1.判断salaryText是否为null
if (salaryText == null) {
return null;
}
//2.判断salaryText是否可转换为一个double类型
double salary = 0;
try {
salary = Double.valueOf(salaryText.toString());
} catch (NumberFormatException e) {
e.printStackTrace();
return null;
}
if (salary > 3000) {
text.set("大于3000的一组...");
return text;
}else if (salary <= 3000 && salary > 2000) {
text.set("小于等于3000并且大于2000的一组...");
return text;
}else {
text.set("小于等于2000的一组");
return text;
}
}
}
5.编写使用UDF
1、编程
2、把程序到出为jar包放到目标机器上去:
hive> add jar /home/beifeng/jars/lower.jar ;
3、创建临时函数:
hive> CREATE TEMPORARY FUNCTION my_lower AS ‘包名.类名';
4、使用指定函数:
hive> show fuctions ;
hive> select my_lower(ename) from emp ;