内容简介
一、Hive自定义函数UDF简介
上一节中,介绍了许多Hive的内置函数,并使用Hive的内置函数实现了WordCount,Hive的内置函数确实为编程带来了极大的便捷,但是,如果遇到过于复杂的业务时,Hive的内置函数会显得乏力,再者,在ETL处理中,一个处理过程可能包含多个处理步骤,而每个步骤都涉及到较为复杂的数据处理,如果用户无法自定义函数处理,则会大大增加业务的复杂程度。因此,Hive提供了用户自定义函数UDF,是一个允许用户扩展HiveSQL的强大的功能,用户可以自己编写一个函数,并将其加入到用户会话中,它就会像Hive的内置函数一样使用。
二、数据准备
1.分析日志数据
27.19.74.143 - - [29/April/2016:17:38:20 +0800] “GET /static/image/common/faq.gif HTTP/1.1” 200 1127
110.52.250.126 - - [29/April/2016:17:38:20 +0800] “GET /data/cache/style_1_widthauto.css?y7a HTTP/1.1” 200 1292
27.19.74.143 - - [29/April/2016:17:38:20 +0800] “GET /static/image/common/hot_1.gif HTTP/1.1” 200 680
以上是apache服务器部分的日志信息,也是本次演示所用到的数据,一共七个字段,分别表示:“host”,“identity”,“user”,“time”,“request”,
“status”,“size”。
2.需求
现在需要对这批原始数据做一次过滤,要求对于size大于1000的访问日志,取出IP,格式化时间,以及访问url。比如 27.19.74.143 - - [29/April/2016:17:38:20 +0800] “GET /static/image/common/faq.gif HTTP/1.1” 200 1127 size = 1127大于1000符合要求,输出结果:27.19.74.143 2016-04-29 /static/image/common/faq.gif
3.创建原始数据表并导入数据
进入hive shell,执行命令:create table logtable(log string)
,创建原始数据表,log字段代表一条日志。先将下面日志文件laog.txt的内容上传至HDFS,然后执行命令:load data inpath '/data/log.txt' into table logtable
,将日志数据导入表中。
laog.txt:
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/faq.gif HTTP/1.1" 200 1127
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /data/cache/style_1_widthauto.css?y7a HTTP/1.1" 200 1292
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/hot_1.gif HTTP/1.1" 200 680
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/hot_2.gif HTTP/1.1" 200 682
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/filetype/common.gif HTTP/1.1" 200 90
110.52.250.126 -