1. 程式人生 > >Hive中的UDF詳解

Hive中的UDF詳解

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