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