本文参考自互联网,并进行结合后整理如下:
Hive自定义函数,用于处理一些比较复杂的数据处理,
比如有如下数据:
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
--一共5个字段,分别表示:”host”、”time”、”request”、”status”、”size”
create table t_log3(host string, time string,request string,status int,size int)
row format delimited
fields terminated by '-';
需要将时间格式转为如下形式:
于是,进行自定义函数,将字段作为参数,传入函数中进行处理后,返回。
使用java开发,自定义函数中的逻辑处理,然后打成jar包,在hive加入这个jar包,并创建函数,指向这个jar包中的逻辑处理类即可。
第一步,开发jar包
直接建立普通的javaSE工程即可,lib目录下,直接将hive包下的lib(除去PHP,py文件夹下的jar,全部加入即可)
package com.imooc.hive.myfun;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @author ruimeng
* @version 创建时间:2019年2月16日 下午4:13:32
* 类说明 :
* 自定义hive函数
*/
public class SelfFunction extends UDF {
//给方法输入参数,这个输入参数,就是字符串[29/April/2016:17:38:20 +0800],在hive中存储时,已经将每条日志信息切割成几个字段了
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包,不需要包含lib目录下的jar包,
第二步,上传jar包到服务器,hive中加入jar包,创建函数,指定处类
必须在hive窗口下执行: hive >
add jar /usr/hive/selfFunction.jar;
CREATE TEMPORARY FUNCTION timeparser AS 'com.imooc.hive.myfun.SelfFunction';
select timeparser(time) from t_log3 ;
注:临时函数只在一次hive会话中有效,重启会话后就无效
永久函数
如果需要经常使用该自定义函数,可以考虑创建永久函数:
拷贝jar包到hive的类路径中:
cp wc.jar apps/hive-1.2.1/lib/
创建了:
create function pfuncx as 'com.doit.hive.udf.UserInfoParser';
删除函数:
DROP TEMPORARY FUNCTION [IF EXISTS] function_name
DROP FUNCTION[IF EXISTS] function_name