Hive內置運算函數,自定義函數(UDF)和Transform
4.Hive函數
4.1 內置運算符
內容較多,見《Hive官方文檔》
4.2 內置函數
內容較多,見《Hive官方文檔》
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
測試各種內置函數的快捷方法:
1、創建一個dual表
create table dual(id string);
2、load一個文件(一行,一個空格)到dual表
hive> load data local inpath'/home/tuzq/software/hivedata/dual.txt' into table dual;
其中dual.txt裏麵隻是一個空格
3、select substr('angelababy',2,3) from dual;
4.3 Hive自定義函數和Transform
當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF:user-defined function)。
4.3.1 自定義函數類別
UDF 作用於單個數據行,產生一個數據行作為輸出。(數學函數,字符串函數)
UDAF(用戶定義聚集函數):接收多個輸入數據行,並產生一個輸出數據行。(count,max)
4.3.2 UDF開發實例
l 簡單UDF示例
前期準備,要把hive的lib包導入到工程中,其中UDF依賴的是hive-exec-1.2.1.jar。也就是說要把apache-hive-1.2.1-bin\lib中內容都引入到工程中。若用到hadoop中的一些api,請把hadoop的api也引入進去。
1、先開發一個java類,繼承UDF,並重載evaluate方法
package hiveudf;
import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text;
public class ToLowerCase extends UDF {
public Text evaluate(final Text s) { if(s == null) {returnnull;} returnnew Text(s.toString().toLowerCase()); } } |
2、打成jar包上傳到服務器
3、將jar包添加到hive的classpath
4、hive> addJAR /home/tuzq/software/hivedata/udf.jar> ;
Added [/home/tuzq/software/hivedata/udf.jar] to class path
Added resources: [/home/tuzq/software/hivedata/udf.jar]
5、hive>創建臨時函數與開發好的java class關聯
hive> create temporary function toLowercase as 'hiveudf.ToLowerCase'; OK Time taken: 0.039 seconds hive> |
5、即可在hql中使用自定義的函數tolowercase ip
hive> select toLowercase("TUZUOQUAN") from dual; OK tuzuoquan Time taken: 0.122 seconds, Fetched: 1 row(s) hive> |
l Json數據解析UDF開發
作業:
有原始json數據如下:
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"} {"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"} {"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"} {"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"} {"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"} {"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"} {"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"} |
需要將數據導入到hive數據倉庫中
我不管你中間用幾個表,最終我要得到一個結果表:
movie | rate | timestamp | uid |
1197 | 3 | 978302268 | 1 |
注:全在hive中完成,可以用自定義函數
4.3.3 Transform實現
Hive的 TRANSFORM 關鍵字提供了在SQL中調用自寫腳本的功能
適合實現Hive中沒有的功能又不想寫UDF的情況
使用示例1:下麵這句sql就是借用了weekday_mapper.py對數據進行了處理.
CREATE TABLE u_data_new ( movieid INT, rating INT, weekday INT, userid INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
add FILE weekday_mapper.py;
INSERT OVERWRITE TABLE u_data_new SELECT TRANSFORM (movieid , rate, timestring,uid) USING 'python weekday_mapper.py' AS (movieid, rating, weekday,userid) FROM t_rating; |
其中weekday_mapper.py內容如下
#!/bin/python import sys import datetime
for line in sys.stdin: line = line.strip() movieid, rating, unixtime,userid = line.split('\t') weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '\t'.join([movieid, rating, str(weekday),userid]) |
最後更新:2017-06-14 08:55:47