標籤:print display form 樣本 last create bsp 查詢 min
一、hive函數
1、hive內建函數
(1)內容較多,見《 Hive 官方文檔》
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
(2)詳細解釋:
http://blog.sina.com.cn/s/blog_83bb57b70101lhmk.html
(3) 測試內建函數的捷徑:
1、建立一個 dual 表 create table dual(id string);
2、 load 一個檔案(一行,一個空格)到 dual 表
3、 select substr(‘huangbo‘,2,3) from dual;
(4)查看內建函數 show functions;
顯示函數的詳細資料 desc function abs;
顯示函數的擴充資訊 desc function extended concat;
(5)詳細使用見文檔
2、hive自訂函數
當 Hive 提供的內建函數無法滿足你的業務處理需要時,此時就可以考慮使用使用者自訂函 數
UDF ( user-defined function)作用於單個資料行,產生一個資料行作為輸出。(數學函數, 字串函數)
UDAF(使用者定義聚集合函式 User- Defined Aggregation Funcation):接收多個輸入資料行,併產 生一個輸出資料行。( count, max)
3、一個簡單的UDF函數樣本:
(1)先開發一個簡單的 java 類,繼承 org.apache.hadoop.hive.ql.exec.UDF,重載 evaluate 方法
(2)打成jar包上傳到伺服器
(3) 將 jar 包添加到 hive 的 classpath
hive>add JAR /root/hivejar /udf.jar;
(4)建立臨時函數與開發好的 class 關聯起來
Hive>create temporary function tolowercase as ‘ com.mazh.udf. ToLowerCase ‘;
(5)至此,便可以在 hql 在使用自訂的函數
select tolowercase(name),age from studentss;
4、Transform實現 (把json資料中timeStamp欄位變成日期編號)
Hive 的 TRANSFORM 關鍵字提供了在 SQL 中調用自寫指令碼的功能。適合實現 Hive 中沒有的 功能又不想寫 UDF 的情況
具體以一個執行個體講解。
(1)先載入 rating.json 檔案到 hive 的一個原始表 rat_json
create table rat_json(line string) row format delimited;
load data local inpath ‘/root/rating.json‘ into table rat_json;
(2) 建立 rate 這張表用來儲存解析 json 出來的欄位:
create table rate(movie int, rate int, unixtime int, userid int) row format delimited fields
terminated by ‘\t‘;
解析 json,得到結果之後存入 rate 表:
insert into table rate select get_json_object(line,‘$.movie‘) as moive,get_json_object(line,‘$.rate‘)
as rate,get_json_object(line,‘$.timeStamp‘) as unixtime,get_json_object(line,‘$.uid‘) as userid
from rat_json;
(3)使用 transform+python 的方式去轉換 unixtime 為 weekday
先編輯一個 python 指令檔
vi weekday_mapper.py
#!/bin/python
import sys
import datetime
for line in sys.stdin:
line = line.strip()
movie,rate,unixtime,userid = line.split(‘\t‘)
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print ‘\t‘.join([movie, rate, str(weekday),userid])
儲存檔案
然後,將檔案加入 hive 的 classpath:
最後查詢看資料是否正確:
select distinct(weekday) from lastjsontable;
二、Hive Shell 操作
Hive(四)hive函數與hive shell