4.Hive函数
4.1 内置运算符
内容较多,见《Hive官方文档》
4.2 内置函数
内容较多,见《Hive官方文档》
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
测试各种内置函数的快捷方法:
1、创建一个dual表
create table dual(id string);
2、load一个文件(一行,一个空格)到dual表
hive> load data local inpath'/home/tuzq/software/hivedata/dual.txt' into table dual;
其中dual.txt里面只是一个空格
3、select substr('angelababy',2,3) from dual;
4.3 Hive自定义函数和Transform
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
4.3.1 自定义函数类别
UDF 作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)
4.3.2 UDF开发实例
l 简单UDF示例
前期准备,要把hive的lib包导入到工程中,其中UDF依赖的是hive-exec-1.2.1.jar。也就是说要把apache-hive-1.2.1-bin\lib中内容都引入到工程中。若用到hadoop中的一些api,请把hadoop的api也引入进去。
1、先开发一个java类,继承UDF,并重载evaluate方法
package hiveudf;
import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text;
public class ToLowerCase extends UDF {
public Text evaluate(final Text s) { if(s == null) {returnnull;} returnnew Text(s.toString().toLowerCase()); } } |
2、打成jar包上传到服务器
3、将jar包添加到hive的classpath
4、hive> addJAR /home/tuzq/software/hivedata/udf.jar> ;
Added [/home/tuzq/software/hivedata/udf.jar] to class path
Added resources: [/home/tuzq/software/hivedata/udf.jar]
5、hive>创建临时函数与开发好的java class关联
hive> create temporary function toLowercase as 'hiveudf.ToLowerCase'; OK Time taken: 0.039 seconds hive> |
5、即可在hql中使用自定义的函数tolowercase ip
hive> select toLowercase("TUZUOQUAN") from dual; OK tuzuoquan Time taken: 0.122 seconds, Fetched: 1 row(s) hive> |
l Json数据解析UDF开发
作业:
有原始json数据如下:
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"} {"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"} {"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"} {"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"} {"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"} {"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"} {"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"} |
需要将数据导入到hive数据仓库中
我不管你中间用几个表,最终我要得到一个结果表:
movie |
rate |
timestamp |
uid |
1197 |
3 |
978302268 |
1 |
注:全在hive中完成,可以用自定义函数
4.3.3 Transform实现
Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能
适合实现Hive中没有的功能又不想写UDF的情况
使用示例1:下面这句sql就是借用了weekday_mapper.py对数据进行了处理.
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内容如下
#!/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]) |