Hive(四)hive函數與hive shell


一、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 建立以前已經完成了。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM