使用內置的函數無法完成分析任務,那麼需要寫自定義函數
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文件
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.1</version>
</dependency>
<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 ;