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) {return?null;} ????? return?new Text(s.toString().toLowerCase()); ?? } } |
?
2、打成jar包上傳到服務器
3、將jar包添加到hive的classpath
4、hive> add jar /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]) |
?
?
?
總結
以上是生活随笔為你收集整理的Hive内置运算函数,自定义函数(UDF)和Transform的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常听说「健身的人吃牛肉、鸡胸肉」,同样是
- 下一篇: 鸡柳的家常做法?