详细讲解Hive自定义函数UDF、UDTF、UDAF基础知识,带你快速入门,首先在Hive中新建表”apache_log”
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.Hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]*\\]]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*) (?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;
这个是官方给出的实例,但是是错的。
不过,已经有人给做出了修改。
接下来结合一些样例数据
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 - - [29/April/2016:17:38:20 +0800] "GET /source/plugin/wsh_wx/img/wsh_zk.css HTTP/1.1" 200 1482
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /data/cache/style_1_forum_index.css?y7a HTTP/1.1" 200 2331
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /source/plugin/wsh_wx/img/wx_jqr.gif HTTP/1.1" 200 1770
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/recommend_1.gif HTTP/1.1" 200 1028
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/logo.png HTTP/1.1" 200 4542
......
这个是apache服务器的日志信息,一共七个字段,分别表示:”host”、”identity”、”user”、”time”、”request”、”status”、”size”,在hive官网上是有九个字段的,剩下两个为:”referer”、”agent”。
------------------------------------------分割线------------------------------------------
样例数据相关资料可从以下信息得到下载:
点击这个 链接关注 Linux公社官方微信,关注后回复数字151443。即可得到网友的分享密码。
如果取消关注Linux公社公众号,即使再次关注,也将无法提供本服务!
链接:https://pan.baidu.com/s/1dvBorZch0WFPMPO2xqZTLQ 密码:获得见上面的方法,地址失效请在下面留言。
------------------------------------------分割线------------------------------------------
我们根据这些数据,从一些小需求中来体会一下这三种函数。
UDF(user-defined functions)
“小”需求:
提取”time”,转换成”yyyy-MM-dd HH:mm:ss” 格式。
要点:
1.继承自“org.apache.hadoop.hive.ql.exec.UDF”;
2.实现”evaluate()”方法。
*JAVA 代码*
package com.hadoop.hivetest.udf;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyDateParser extends UDF{
public String evaluate(String s){
SimpleDateFormat formator = new SimpleDateFormat("dd/MMMMM/yyyy:HH:mm:ss Z",Locale.ENGLISH);
if(s.indexOf("[")>-1){
s = s.replace("[", "");
}
if(s.indexOf("]")>-1){
s = s.replace("]", "");
}
try {
//将输入的string转换成date数据类型
Date date = formator.parse(s);
SimpleDateFormat rformator = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return rformator.format(date);
} catch (ParseException e) {
e.printStackTrace();
return "";
}
}
}
小插曲
导出为jar包,发送到Linux上。这次我们可以使用 editplus 编辑器来上传: