hive - 自定義函數(超詳細步驟,手把手的交)

用Java開發自定義函數,步驟:

1.eclipse上新建一個工程project(db2019);

 

2.導jar依賴包:

db2019右鍵 --build path --configure...

--add library --user library --new(新建一個library(hive2.3.2_jar))

--add external jars(添加jar包) --認準路徑,全選所有包(一般第一個不是)

--點OK --勾選hive2.3.2_jar --Finish --Apply --點OK

 

3.新建一個包package(com.ghgj.cn.udf):

--右鍵db2019下的src --new --package --輸入name(com.ghgj.cn.udf) --Finish

 

4.定義一個類class(MyUdf):

--右鍵com.ghgj.cn.udf --new --class --輸入name(MyUdf) --Finish

此時代碼自動顯示爲:

package com.ghgj.cn.udf;

public calss MyUdf{

}

 

5.繼承 UDF 這個類

--下載hive源碼包:apache-hive-2.3.2-src.tar.gz

--解壓源碼包得到:apache-hive-2.3.2-src.tar

--再解壓apache-hive-2.3.2-src.tar,得到文件:apache-hive-2.3.2-src

package com.ghgj.cn.udf;

public calss MyUdf extends UDF{

}

--選中UDF,在自動冒出來的所有選擇中,選擇是hive的(org.apache.hadoop.hive.ql.exec)

 

關聯一下 UDF 和源碼包 apache-hive-2.3.2-src:

--點擊代碼中的UDF --attach source

--選擇external location --添加路徑(external folder...)

--找到源碼包 apache-hive-2.3.2-src --點確定 --點OK(然後等待兩者關聯)

生成一個UDF.class的類,這個類中告訴我們:

  • 新建的MyUdf類必須先繼承這個類,即:public calss MyUdf extends UDF{}
  • 新建的MyUdf類可以實現一個或多個自定義函數evaluate()
  • 自定義函數evaluate()可以被hive調用

 

 

6.在eclipse中實現一個或多個自定義函數evaluate()

package com.ghgj.cn.udf; import org.apache.hadoop.hive.ql.exec.UDF; public calss MyUdf extends UDF{ //evaluate()括號中輸入需要處理的字段,可以是一個或多個,並需要指定參數類型 //return的結果是什麼類型,則evaluate()前就輸入什麼類型 private int evaluate(int age){ //年齡對3取餘 int res = age%3; return res } private int evaluate(int a,int b){ //求和 return a+b } private String evaluate(String ip){ //將IP地址補全爲三位數,便於比較 //65.727.2.9 補全爲065.727.002.009 int res = age%3; String[] split = ip.split('\\.');#將IP根據.分割開,.需要轉義 StringBuffer sb = new StringBuffer();#先創建一個空的StringBuffer類型的串 for(String s:split){ //邏輯:每一個數字前添加至少3個0,然後截取後三位 //65-->00065-->取後三位065 String tmp = '000' + s; #數字前添加0 //截取後3位,並在每個數字後面添加分隔符. sb.append(tmp.substring(tmp.length()-3)).append('.'); //去掉最後一個分隔符. resb = sb.toString().substring(0,sb.length()-1); } return resb } }

測試一下:

public static void main(String[] args) { MyUdf mu = new MyUdf(); System.out.printIn(mu.evaluate(5)); #測試第1個,5%3=2,輸出2 System.out.printIn(mu.evaluate(5,3)); #測試第2個,5+3=8,輸出8 System.out.printIn(mu.evaluate('65.727.2.9')); #測試第3個,輸出065.727.002.009 }

 

 

hive上添加自定義函數,步驟:

1.打jar包

--右鍵com.ghgj.cn.udf --export...

--點擊jar file --下一步

--展開db2019 --勾選com.ghgj.cn.udf

--修改jar file中的jar包的名稱(myudf.jar) --Finish

 

2.將jar包上傳到Linux

  1. [hadoop@hadoop01 ~]$ Alt+P #打開sftp
  2. sftp>
  3. 拖動jar包文件到SecureGRT對話框中
  4. [hadoop@hadoop01 ~]$ cd~
  5. [hadoop@hadoop01 ~]$ ls #查看列表中是否有myudf.jar

 

 

3.將jar包放在hive的classpath下

在hive客戶端執行下面命令:add jar [jar包的路徑]

hive> add jar /user/hadoop/myudf.jar;

結果:

added [/user/hadoop/myudf.jar] to class path

added resources:[/user/hadoop/myudf.jar]

表示命令執行成功,但是jar包不一定真的添加成功

檢測jar包是否添加成功:

list jars;

若運行結果中有/user/hadoop/myudf.jar,代表添加成功

 

4.給自定義函數evaluate()添加別名,並在hive中註冊這個函數

create temporary function my_fuc as 'com.ghgj.cn.udf.MyUdf';

temporary是臨時的意思,代表hive當前客戶端一旦關閉,my_fuc便失效;

as 後面跟的是主類名路徑:

--eclipse中在代碼中右擊MyUdf --copy qualified name(則複製了MyUdf的全路徑名)

 

5.查看hive的函數庫中是否已添加自定義函數my_fuc

show functions;

內置函數有271個,若顯示有272個,且能找到my_fuc,代表添加成功

 

注意:

  • 以上方式添加的函數是臨時的函數,hive當前客戶端一旦關閉,my_fuc便失效;
  • 若需要再次使用,則需要重複步驟3、4、5
  • 生產中一般也使用這種臨時的方式,若需要變成永久函數,需要改源碼,太麻煩不建議使用。

 

 

 

hive上使用自定義函數

my_fuc有多個evaluate()方法,通過函數名稱evaluate和參數(參數個數和類型)可以確定調用的是哪個方法

hive>select my_fuc(4); # 4%3=1,輸出1 hive>select my_fuc(4,3); # 4+3=7,輸出7 hive>select my_fuc('1.234.11.7'); # 輸出001.234.011.007

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章