1. 程式人生 > >Hive 函數

Hive 函數

load data 示例 實例 con sta function jar maven項目 unixtime

1. 內置運算符
在Hive有四種類型的運算符:
· 關系運算符
· 算術運算符
· 邏輯運算符
· 復雜運算
內容較多,見《Hive官方文檔》或者《hive常用運算和函數.doc》
2. 內置函數
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
測試各種內置函數的快捷方法:
創建一個dual表
create table dual(id string);
load一個文件(只有一行內容:內容為一個空格)到dual表
select substr(‘angelababy‘,2,3) from dual;
內容較多,見《Hive官方文檔》或者《hive常用運算和函數.doc》
3. Hive 自定義函數和Transform
當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF:user-defined function)。
3.1. UDF 開發實例
新建JAVA maven項目
添加 hive-exec-1.2.1.jar和hadoop-common-2.7.4.jar依賴(見參考資料)
1、寫一個java類,繼承UDF,並重載evaluate方法
package cn.itcast.bigdata.udf
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Lower extends UDF{
public Text evaluate(Text s){
if(s==null){return null;}
return new Text(s.toString().toLowerCase());
}
}
2、打成jar包上傳到服務器
3、將jar包添加到hive的classpath
hive>add JAR /home/hadoop/udf.jar;
4、創建臨時函數與開發好的java class關聯
create temporary function tolowercase as ‘cn.itcast.bigdata.udf.ToProvince‘;
5、即可在hql中使用自定義的函數tolowercase ip
Select tolowercase(name),age from t_test;

3.2. Transform實現(了解)
Hive的 TRANSFORM 關鍵字提供了在SQL中調用自寫腳本的功能
適合實現Hive中沒有的功能又不想寫UDF的情況
使用示例1:下面這句sql就是借用了weekday_mapper.py對數據進行了處理.
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])

4. Hive 特殊分隔符處理(擴展)
hive讀取數據的機制:
首先用InputFormat<默認是:org.apache.hadoop.mapred.TextInputFormat >的一個具體實現類讀入文件數據,返回一條一條的記錄(可以是行,或者是你邏輯中的“行”)
然後利用SerDe<默認:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe>的一個具體實現類,對上面返回的一條一條的記錄進行字段切割。
Hive對文件中字段的分隔符默認情況下只支持單字節分隔符,如果數據文件中的分隔符是多字符的,如下所示:
01||zhangsan
02||lisi
可用使用RegexSerDe通過正則表達式來抽取字段
drop table t_bi_reg;
create table t_bi_reg(id string,name string)
row format serde ‘org.apache.hadoop.hive.serde2.RegexSerDe‘
with serdeproperties(
‘input.regex‘=‘(.)\|\|(.)‘,
‘output.format.string‘=‘%1$s %2$s‘
)
stored as textfile;
hive>load data local inpath ‘/root/hivedata/bi.dat‘ into table t_bi_reg;
hive>select * from t_bi_reg;
其中:
input.regex:輸入的正則表達式
表示 || 左右兩邊任意字符被抽取為一個字段
output.format.string:輸出的正則表達式
%1$s %2$s則分別表示表中的第一個字段、第二個地段
註意事項:
a、使用RegexSerDe類時,所有的字段必須為string
b、input.regex裏面,以一個匹配組,表示一個字段

Hive 函數