Hive自定义函数和Transform

发布 : 2016-02-12 分类 : 大数据 浏览 :
1
2
3
4
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

UDF作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)

1.UDF开发实例

1.1、先开发一个java类,继承UDF,并重载evaluate方法

1
2
3
4
5
6
7
8
9
10
11
12
package com.matrix.hiveudf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class ToLowerCase extends UDF{

// 必须是public
public String evaluate(String field){
String result = field.toLowerCase();
return result;
}
}

1.2、打成jar包上传到服务器

1.3、将jar包添加到hive的classpath

1
hive> add JAR /home/hadoop/udf.jar;

1.4、创建临时函数与开发好的java class关联

1
Hive> create temporary function tolowercase as 'com.matrix.hiveudf.ToProvince';

1.5、即可在hql中使用自定义的函数strip

2.Transform实现

1
2
Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能
适合实现Hive中没有的功能又不想写UDF的情况

2.1、下面这句sql就是借用了weekday_mapper.py对数据进行了处理.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE u_data_new (
movieid INT,
rating INT,
weekday INT,
userid INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

add FILE weekday_mapper.py;

INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (movieid , rate, timestring,uid)
USING 'python weekday_mapper.py'
AS (movieid, rating, weekday,userid)
FROM t_rating;

其中weekday_mapper.py内容如下

1
2
3
4
5
6
7
8
9
#!/bin/python
import sys
import datetime

for line in sys.stdin:
line = line.strip()
movieid,rating,unixtime,userid = line.split('\t')
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '\t'.join([movieid, rating, str(weekday),userid])
本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2016/02/12/Hive自定义函数和Transform/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹