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
…………

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页