Hive中的UDF詳解
阿新 • • 發佈:2020-12-21
hive作為一個sql查詢引擎,自帶了一些基本的函式,比如`count`(計數),`sum`(求和),有時候這些基本函式滿足不了我們的需求,這時候就要寫`hive hdf(user defined funation)`,又叫使用者自定義函式。
# UDF 建立與使用步驟
- 繼承`org.apache.hadoop.hive.ql.exec.UDF`類,實現evaluate方法;
- 打`jar`包上傳到叢集,通過`create temporary function`建立臨時函式,不加`temporary`就建立了一個永久函式;
- 通過select 語句使用;
## 例一
下面是一個判斷hive表字段是否包含`’100’`這個子串的簡單`udf`:
```java
package com.js.dataclean.hive.udf.hm2
import org.apache.hadoop.hive.ql.exec.UDF;
public class IsContains100 extends UDF{
public String evaluate(String s){
if(s == null || s.length() == 0){
return "0";
}
return s.contains("100") ? "1" : "0";
}
}
```
使用maven將其打包,進入`hive cli`,輸入命令:
```shell
add jar /home/hadoop/codejar/flash_format.jar;
create temporary function isContains100 as 'com.js.dataclean.hive.udf.hm2.IsContains100';
```
建立完臨時函式,即可使用這個函數了:
```sql
select isContains100('abc100def') from table limit 1;
1
```
## 例二
通過讀取mysql資料庫中的規則,為hive中的workflow返回對應的,型別:
```
type workflow
a 1
a 2
b 11
b 22
b 33
```
**需求**:我們希望,將hive的workflow欄位取值為,1,2的變為型別(type)`a`,取值為11,22,33的全部變為`b`,就是歸類的意思。
這個udf可以這麼實現:
```java
package com.js.dataclean.hive.udf.hm2.workflow;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ Author: keguang
* @ Date: 2018/12/13 16:24
* @ version: v1.0.0
* @ description:
*/
public class GetWorkflow extends UDF{
private static final String host = "0.0.0.0";
private static final String port = "3306";
private static final String database = "root";
private static final String userName = "root";
private static final String password = "123456";
private static String url = "";
private static final String driver = "com.mysql.jdbc.Driver";
private static Connection conn = null;
private st