Hive自定義函數UDF與transform的區別和使用例子

       hive是給了我們很多內置函數的,比如轉大小寫,截取字符串等,具體的都在官方文檔裏面。但是並不是所有的函數都能滿足我們的需求,所以hive提供了給我們自定義函數的功能。

     一般有兩種方法:自定義內置函數 UDF(Java實現)和Transform關鍵字(Python)實現

一、Transform關鍵字(Python)實現

       Hive 的 TRANSFORM 關鍵字提供了在 SQL 中調用自寫腳本的功能。適合實現 Hive 中沒有的 功能又不想寫 UDF 的情況,腳本一般都是python寫的。

Json 數據如下:

[work@app ~/work/test]$ cat rating.json 
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"1195","rate":"8","timeStamp":"978301900","uid":"2"}

需求:把json的字段timeStamp轉換爲日期編號。

1.1、先加載 rating.json 文件到 hive 的一個原始表 rate_json

create table yz_rate_json(line string) row format delimited;

load data local inpath '/home/work/test/rating.json' into table yz_rate_json; 

hive> select * from yz_rate_json;
OK
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"1195","rate":"8","timeStamp":"978301900","uid":"2"}

1.2、創建 rate 這張表用來存儲解析 json 出來的字段:

create table yz_rate(movie int, rate int, unixtime int, userid int) row format delimited fields terminated by '\t';

  解析 json,得到結果之後存入 rate 表: 

insert into table yz_rate select 
get_json_object(line,'$.movie') as movie,
get_json_object(line,'$.rate') as rate,
get_json_object(line,'$.timeStamp') as unixtime,
get_json_object(line,'$.uid') as userid
from yz_rate_json;

hive> select * from yz_rate;
OK
1193    5    978300760    1
1195    8    978301900

1.3、使用 transform+python 的方式去轉換 unixtime 爲 weekday

注意: 使用TRANSFORM需要將所有的候選變量,全部做處理,hive中不能接受select a, transform(b)的形式; 只能是select transform(a, b) using '***.py' as (new_a, new_b);

 1.3.1 先編輯一個 python 腳本文件

[work@app ~/work/test]$ cat datechange.py 
# coding=utf-8
import sys
import datetime
for line in sys.stdin:
    #獲取每一行的內容並去掉頭尾的空格
    line = line.strip()
    #根據換行符截取對應的字段
    movie,rate,timeinfo,userid = line.split('\t')
    #將timeinfo轉成時間格式
    weekday = datetime.datetime.fromtimestamp(float(timeinfo)).isoweekday()
    #重新拼接拼接新的內容並加入換行符
    print '\t'.join([movie, rate, str(weekday),userid])

1.3.2、創建最後的用來存儲調用 python 腳本解析出來的數據的表:yz_lastjsontable

create table yz_lastjsontable(movie int, rate int, weekday int, userid int) row format delimited
fields terminated by '\t';

1.3.3、保存文件 然後,將文件加入 hive 的 classpath:

add file /home/work/datechange.py;
insert into table yz_lastjsontable select transform(movie,rate,unixtime,userid)
using 'python datechange.py' as(movie,rate,weekday,userid) from yz_rate;

1.3.4、最後查詢看數據是否正確

hive> select * from  yz_lastjsontable;
OK
1193    5    1    1
1195    8    1    2

 參考:https://www.cnblogs.com/songweideboke/p/9814604.html

二、自定義函數UDF

Hive 自定義函數UDF開發手把手教程—— 創建臨時函數和永久函數

三、查看官方提供和永久自定義函數的方法

hive> show functions;
OK
!
!=
%
&
*
+
-
/
<
<=
<=>
<>
=
==
>
>=
^
abs
acos
add_months
and
array
array_contains
ascii
asin
assert_true
atan
avg
base64
between
bin
case
cbrt
ceil
ceiling
coalesce
collect_list
collect_set
compute_stats
concat
concat_ws
…………

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章