一、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 操作
1、hive 命令行
語法結構:
hive [-hiveconf x=y]* [<-i filename>]* [<-f filename>|<-e query-string>] [-S]
說明:
(1) -i 從文件初始化 HQL。
(2) -e 從命令行執行指定的 HQL
(3) -f 執行 HQL 腳本
(4) -v 輸出執行的 HQL 語句到控制台
(5) -p <port> connect to Hive Server on port number
(6) -hiveconf x=y( Use this to set hive/hadoop configuration variables)
(7)-S 表示以不打印日志的形式執行 (hive -S -e ......)
實例:
(1)
(2)運行一個文件
(3)運行參數文件
從配置文件啟動 hive,並加載配置文件當中的配置參數
2、hive參數配置方式
hive參數大全:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
開發 Hive 應用時,不可避免地需要設定 Hive 的參數。設定 Hive 的參數可以調優 HQL 代碼 的執行效率,或幫助定位問題。然而實踐中經常遇到的一個問題是,為什么設定的參數沒有起作用?這通常是錯誤的設定方式導致的。
對於一般參數,有以下三種設定方式:
配置文件 (全局有效)
命令行參數(對 hive 啟動實例有效) (hive -i ...)
參數聲明 (對 hive 的連接 session 有效)(進入hive客戶端之后設置)
優先級:參數聲明 高於命令行參數 高於配置文件
(1)配置文件: Hive 的配置文件包括
用戶自定義配置文件: $HIVE_CONF_DIR/hive-site.xml
默認配置文件: $HIVE_CONF_DIR/hive-default.xml
用戶自定義配置會覆蓋默認配置。
另外, Hive 也會讀入 Hadoop 的配置,因為 Hive 是作為 Hadoop 的客戶端啟動的, Hive 的配
置會覆蓋 Hadoop 的配置。
配置文件的設定對本機啟動的所有 Hive 進程都有效。
(2)命令行參數:啟動 Hive(客戶端或 Server 方式)時,可以在命令行添加-hiveconf param=value
來設定參數,例如:
bin/hive -hiveconf hive.root.logger=INFO,console
這一設定對本次啟動的 Session(對於 Server 方式啟動,則是所有請求的 Sessions)有效。
(3)
參數聲明:可以在 HQL 中使用 SET 關鍵字設定參數,例如:
set mapred.reduce.tasks=100;
這一設定的作用域也是 session 級的。
set hive.exec.reducers.bytes.per.reducer=<number> 每個 reduce task 的平均負載數據量 hive 會估算我們的總數據量,然后用總數據量除以上述參數值,就能得出需要運行的 reduce task 數
set hive.exec.reducers.max=<number> 設置 reduce task 數量的上限
set mapreduce.job.reduces=<number> 指定固定的 reduce task 數量 但是,這個參數在必要時<業務邏輯決定只能用一個 reduce task> hive 會忽略
上述三種設定方式的優先級依次遞增。即參數聲明覆蓋命令行參數,命令行參數覆蓋配置文 件設定。注意某些系統級的參數,例如 log4j 相關的設定,必須用前兩種方式設定,因為那 些參數的讀取在 Session 建立以前已經完成了。