首先将hive lib中的jar包放到类路径下面
extends udf
evaluate 方法可以有多个,为重载,根据传入参数值的类型加以区分
导出jar包 idea导出很麻烦,果断换eclipse
hive下 add JAR xxx.jar;
hive> create temporary function functionName as 'jar包所在的类名';
select num xx(num) from p;
处理json格式文件
ObjectMapper om =
new
ObjectMapper();
try
{
MovierateBean bean = om.readValue(jsonline,MovierateBean.
class
);
return
bean.toString();
}
catch
(Exception e){
return
(jsonline);
}
扫描二维码关注公众号,回复:
134218 查看本文章
Hive的UDF、UDAF需要通过java语言编写。Hive提供了另一种方式,达到自定义UDF和UDAF的目的,但使用方法更简单。这就是TRANSFORM。TRANSFORM语言支持通过多种语言,实现类似于UDF的功能。
Hive还提供了MAP和REDUCE这两个关键字。但MAP和REDUCE一般可理解为只是TRANSFORM的别名。并不代表一般是在map阶段或者是在reduce阶段调用。详见官网说明。
我们可以使用如下的python脚本代替上面的UDF函数:
服务器端/opt/movie_trans.py脚本内容如下:
import
sys
import
datetime
import
json
for
line
in
sys.stdin:
#line='{"movie":"2797","rate":"4","timeStamp":"978302039","uid":"1"}'
line
=
line.strip()
hjson
=
json.loads(line)
movie
=
hjson[
'movie'
]
rate
=
hjson[
'rate'
]
timeStamp
=
hjson[
'timeStamp'
]
uid
=
hjson[
'uid'
]
timeStamp
=
datetime.datetime.fromtimestamp(
float
(timeStamp))
print
'\t'
.join([movie, rate,
str
(timeStamp),uid])
|
在hive中执行如下脚本:
ADD
FILE
/
opt
/
movie_trans.py;
SELECT
TRANSFORM (rate)
USING
'python movie_trans.py'
AS (movie,rate, timeStamp, uid)
FROM rating;